使用 nginx 反向代理进行重定向

使用 nginx 反向代理进行重定向

我有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_hostproxy_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;
}

相关内容