我目前已设置 nginx 以通过 Varnish 提供内容。Nginx 监听端口 8000,而 varnish 将用户的请求从 80 连接到 8000。
问题是,在某些情况下,特别是当尝试访问目录时,例如site.com/2010
,nginx 会将请求重定向到site.com:8000/2010/
。
我该如何预防?
答案1
在我的例子中,nginx 监听80
docker 容器内的端口,但它被映射到8080
容器外的端口(或任何随机端口)。中间没有可以为端口添加适当标头的反向代理,我也不想在 nginx 配置中对其进行硬编码。
错误重定向的示例:
http://localhost:8080/directory -> http://localhost/directory/
我试过:
server {
# ...
port_in_redirect off;
server_name_in_redirect off;
# ...
}
但它不起作用。唯一有效的是:
server {
# ...
absolute_redirect off;
# ...
}
手动输入absolute_redirect
说:
如果禁用,nginx 发出的重定向将是相对的。
我发现这更加灵活,并且不需要您在任何地方对服务器名称和端口进行硬编码。
如果你担心相对 URL 的重定向,请检查此评论。
答案2
通过更仔细地阅读,我找到了这个问题的答案HttpCoreModule 文档。
port_in_redirect off;
这将保留客户端在重定向期间使用的端口。与之密切相关的是,server_name_in_redirect
它使用第一个主机名进行重定向。由于我不希望 sitename.v.myserver.com 重定向到 sitename.com,
答案3
NGINX 背后的代码可能使用 FASTCGI 变量 SERVER_PORT 来确定将用户引导到哪里。SERVER_PORT 将包含 nginx 监听的端口,因此在您的情况下该端口将是 8000。
您可以尝试以下类似方法进行测试:
location ~ \.php$ {
[...]
fastcgi_param SERVER_PORT 80;
}
适应您的配置。这是一个肮脏的黑客行为,但可以帮助您诊断问题。
答案4
我在 docker 中的 80:8080(端口映射)上使用 Nginx+PHP-FPM 时遇到了同样的问题。port_in_redirect 没有帮助。使用 absolute_redirect 时,问题会定期出现。
所以我的解决方案是:创建文件 fe schema.conf:
map $http_x_forwarded_proto $balancer_port {
default 80;
"https" 443;
}
map $http_x_forwarded_proto $balancer_https {
default "NO";
"https" "YES";
}
然后只需使用需要的端口:
location ~ \.php$ {
try_files $uri @bitrix;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SERVER_PORT $balancer_port;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}