![使用 nginx 反向代理进行重定向](https://linux22.com/image/627175/%E4%BD%BF%E7%94%A8%20nginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E8%BF%9B%E8%A1%8C%E9%87%8D%E5%AE%9A%E5%90%91.png)
我有a.b
域名(例如)并希望username.github.io/project
在 中提供一些 github 页面( )a.b/c
。这意味着我还想保留我的浏览器 URLa.b/c
并显示 的内容username.github.io/project
。
我在 nginx 模块中有以下设置
location /c {
proxy_pass http://username.github.io/project;
proxy_redirect http://username.github.io http://a.b;
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_buffering off;
}
如果我更改proxy_set_header Host $http_host
为proxy_set_header Host $proxy_host
或$host
,它只会重定向到 ,http://username.github.io/project
这不是我想要的。我该怎么办?
答案1
只需通过以下方式将正确的主机标头发送到您的代理目标即可移除線proxy_set_header Host $http_host
。
如果a.b
在您的服务器块中将其配置为服务器名称,那么您甚至不需要proxy_redirect
指令,如果您在位置前缀和目标中使用尾部斜杠,proxy_pass
如所解释的那样在文档中:
Syntax: proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement; Default: proxy_redirect default; Context: http, server, location
[...]
default 参数指定的默认替换使用 location 和 proxy_pass 指令的参数。因此,以下两个配置是等效的:
location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect default; } location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect http://upstream:port/two/ /one/; }
[...]
因此,应该这样做:
server {
server_name a.b;
location /c/ {
proxy_pass http://username.github.io/project/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
}
}
答案2
使用
proxy_redirect off;
因此你的设置将是
location /c {
proxy_pass http://username.github.io/project;
proxy_redirect http://username.github.io;
proxy_set_header Host username.github.io;
proxy_set_header X-Host username.github.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
}