Nginx 进行重定向,而不是代理

问题描述 投票:0回答:4

我想将 Nginx 设置为 https 服务的反向代理,因为我们有一个特殊的用例,我们需要“取消 https”连接:

http://nginx_server:8080/myserver ==> https://mysecureservice

但是实际发生的情况是实际的 https 服务没有被代理。 Nginx 确实将我重定向到实际的服务,因此浏览器中的 URL 发生了变化。我想与 Nginx 交互,因为它是实际的服务,只是没有 https。

这就是我所拥有的:

server {
    listen 0.0.0.0:8080 default_server;
    location /myserver {
        proxy_pass https://myserver/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }
}
ssl nginx https proxy reverse-proxy
4个回答
15
投票

您必须使用

proxy_redirect
来处理重定向。

 Sets the text that should be changed in the “Location” and “Refresh” header fields of a 
 proxied server response. Suppose a proxied server returned the header field 
 “Location:https://myserver/uri/”. The directive
 will rewrite this string to “Location: http://nginx_server:8080/uri/”. 

示例:

 proxy_redirect https://myserver/ http://nginx_server:8080/;

来源:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect


14
投票

如果你不希望服务器进行重定向,你可以这样设置 nginx:

server
{
    listen 80;
    server_name YOUR.OWN.DOMAIN.URL;
    location / {
        proxy_pass http://THE.SITE.URL.YOU.WANT.TO.DELEGAGE/;
        proxy_redirect off;
        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;
    }
}

4
投票

对我来说,这个配置就足够了:

events {
}

http {
    server {
        location / {
            resolver 8.8.8.8;
            proxy_pass https://www.example.com$request_uri;
        }
    }
}

(请注意,

resolver
指令与OP中的问题无关,我只是需要它能够代理外部域,例如
example.com

对我来说问题是我错过了

www.
中的
www.example.com
。在 Firefox 开发者控制台中,我可以看到对
localhost
的 GET 请求返回了 301,因此我认为 NGINX 正在发出 301,而不仅仅是镜像
example.com
。事实并非如此:事实上,问题在于
example.com
返回 301 重定向到
www.example.com
,NGINX 尽职尽责地镜像这些 301,然后 Firefox 直接从
localhost
“更改了 URL”(遵循重定向)到
www.example.com 
.


2
投票

我也遇到了类似的问题。就我而言,我可以通过在

proxy_pass
URL 添加尾部斜杠来解决该问题:

之前

server {
  location / {
    proxy_pass http://example.com/path/to/some/folder;
  }
}

之后

server {
  location / {
    # added trailing slash
    proxy_pass http://example.com/path/to/some/folder/;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.