nginx 将不带尾部斜杠的子目录请求重定向到具有指定端口的 URL

nginx 将不带尾部斜杠的子目录请求重定向到具有指定端口的 URL

我有以下问题。

在我的本地测试配置中,当我尝试访问时,https://www.testdomain.local/admin它总是会将我重定向到https://www.testdomain.local:8443/admin/我的系统无法解析的位置。

我的 nginx 在 Docker 容器内运行,该容器将对端口 443 的请求转发到 nginx 监听的端口 8443。

admin 文件夹是根文件夹的子目录。

root -> /application/public/testdomain
root/admin -> /application/public/testdomain/admin

当前的行为如下所示:

https://www.testdomain.local -> https://www.testdomain.local (correct)
https://www.testdomain.local/ -> https://www.testdomain.local (correct)
https://www.testdomain.local/admin/ (with trailing slash) -> https://www.testdomain.local/admin/ (correct)
https://www.testdomain.local/admin (without trailing slash) -> https://www.testdomain.local:8443/admin/ (incorrect)

对于最后一种情况,我倾向于以下行为:

https://www.testdomain.local/admin -> https://www.testdomain.local:8443/admin or https://www.testdomain.local/admin/

我尝试了通过 Google 或 ServerFault 找到的许多解决方案,但无法获得所需的行为。

server {
    listen 8443 ssl;

    server_name www.testdomain.local;
    
    client_max_body_size 108M;

    access_log /var/log/nginx/testdomain.access.log anonymized;

    ssl_certificate /application/common/certificate.crt;
    ssl_certificate_key /application/common/privatekey.key;

    root /application/public/testdomain;
    index index.php;
    
    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }
    
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }
    
}

答案1

nginx 不知道您实际上是在默认端口 443 上为网站提供服务,因为您告诉它监听不同的端口。因此,当它创建自己的重定向时,它会添加非标准端口号。

您可以使用以下方式关闭此行为port_in_redirect off;.nginx 将在其重定向中省略端口号。

或者,你可以使用以下方法关闭绝对重定向absolute_redirect off;并且所有重定向都将相对于 URL 路径根。在这种情况下,nginx 将重定向到/admin/而不是https://www.testdomain.local:8443/admin/

相关内容