![nginx 将不带尾部斜杠的子目录请求重定向到具有指定端口的 URL](https://linux22.com/image/755148/nginx%20%E5%B0%86%E4%B8%8D%E5%B8%A6%E5%B0%BE%E9%83%A8%E6%96%9C%E6%9D%A0%E7%9A%84%E5%AD%90%E7%9B%AE%E5%BD%95%E8%AF%B7%E6%B1%82%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E5%85%B7%E6%9C%89%E6%8C%87%E5%AE%9A%E7%AB%AF%E5%8F%A3%E7%9A%84%20URL.png)
我有以下问题。
在我的本地测试配置中,当我尝试访问时,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/
。