防止 nginx 重定向时端口发生变化

防止 nginx 重定向时端口发生变化

我目前已设置 nginx 以通过 Varnish 提供内容。Nginx 监听端口 8000,而 varnish 将用户的请求从 80 连接到 8000。

问题是,在某些情况下,特别是当尝试访问目录时,例如site.com/2010,nginx 会将请求重定向到site.com:8000/2010/

我该如何预防?

答案1

在我的例子中,nginx 监听80docker 容器内的端口,但它被映射到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;
    }

相关内容