301重定向时nginx保留端口号

Posted

技术标签:

【中文标题】301重定向时nginx保留端口号【英文标题】:nginx keep port number when 301 redirecting 【发布时间】:2017-09-09 21:02:49 【问题描述】:

我正在尝试将网络应用的第二个品牌合并到第一个品牌中,并使用 301 重定向来重定向任何挥之不去的流量。服务器在 8001 端口上转发的 Vagrant box 中运行。我想要:

而不是 https://local-dev-url:8001/foo/(anything) 301 到 https://local-dev-url:8001/(anything)

而不是 https://local-dev-url:8001/adminfoo/(anything) 301 到 https://local-dev-url:8001/admin/(anything)

这是我所拥有的:

    location ~ /foo/?(.*)$ 
        return 301 $1/;
    

    location ~ /adminfoo/?(.*)$ 
        return 301 admin/$1/;
    

    location / 
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header Authorization $http_authorization;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect http:// $scheme://;
    

    location /admin/ 
        alias /hostonly/path/to/admin/stuff/;
    

但是,不是将 https://local-dev-url:8001/foo/ 重定向到 https://local-dev-url:8001/,而是将 301 重定向到 https://local-dev-url//。 (没有端口号,额外的斜杠。)我已经看到了对重定向 URL 进行硬编码的答案,但是由于我与许多其他开发人员一起工作并且我们都有唯一的本地开发 URL,唯一一致的部分是: 8001 端口号。

有没有办法将 301 配置为按需要工作?

【问题讨论】:

这个服务器在监听哪个端口?你是转发 8001 到 80 吗? @RichardSmith 端口 443,而不是 80。 【参考方案1】:

如果nginx 没有在端口 8001 上侦听,则它无法知道在重定向中使用哪个端口。您需要明确指定它:

location ~ /foo(.*)$ 
    return 301 $scheme://$http_host$1;

location ~ /adminfoo(.*)$ 
    return 301 $scheme://$http_host/admin$1;

$http_host 变量由原始请求中的主机名和端口组成。详情请见this document。

【讨论】:

我在使用docker 进行端口转发时遇到了这个问题。同样的概念在这里也适用。容器内部的nginx 正在监听端口80 并且docker 容器的端口被转发,因此nginx 在重定向时将使用80 :) 太棒了! ty【参考方案2】:

对我来说,编辑 proxy.conf 中的以下行使其看起来像这样,成功了:

proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;

【讨论】:

以上是关于301重定向时nginx保留端口号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nginx 服务器上做 301 重定向

在 NGINX 中执行 301 重定向时跳过参数

ngin配置301重定向设置方法和nginx子目录301重定向

.htaccess 301 重定向,保留路径

nginx为啥返回301重定向

如果没有斜杠,Nginx 会导致 301 重定向