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

Jon*_*Kim 4 nginx proxy reverse-proxy redirect

我有a.b域(例如)并希望username.github.io/projecta.b/c. 这意味着我还想将我的浏览器 url 保留a.b/cusername.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;
}
Run Code Online (Sandbox Code Playgroud)

如果我更改proxy_set_header Host $http_hostproxy_set_header Host $proxy_hostor $host,它只是重定向到http://username.github.io/project我不想要的。我能怎么做?

Xav*_*cas 9

只需删除proxy_set_header Host $http_host行,正确的 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
Run Code Online (Sandbox Code Playgroud)

[...]

默认参数指定的默认替换使用 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/;
}
Run Code Online (Sandbox Code Playgroud)

[....]

所以,这应该这样做:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)