nginx 301重定向时保留端口号

nginx keep port number when 301 redirecting

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

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

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

这是我拥有的:

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

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

    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/ to https://local-dev-url:8001/ it is 301ing to https://local-dev-url//。 (没有端口号,额外的斜杠。)我看到了对重定向的 URL 进行硬编码的答案,但由于我与许多其他开发人员一起工作,我们都有独特的本地开发人员 URL s,唯一一致的部分是:8001端口号。

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

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

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

$http_host 变量由原始请求中的主机名和端口组成。有关详细信息,请参阅 this document

对我来说,将 proxy.conf 中的以下几行编辑成这样,就成功了:

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