当我将发送到上游服务器的主机头设置为 $proxy_host 时,我得到了请求的页面,但浏览器中的 url 更改为上游 url。
...
proxy_set_header Host $proxy_host;
proxy_pass ...
上面的方法工作正常,只是浏览器中的 URL 发生了变化,并显示上游 URL,而不是用户输入的 URL - 我们希望显示用户的 URL
为了解决这个问题,当我发送 $host 时,浏览器中会出现一个错误,提示连接被拒绝。
...
proxy_set_header Host $host;
proxy_pass ...
这给出了连接被拒绝的错误 - 我不确定这个错误是由 nginx 生成的还是由我的上游服务器生成的。我无法控制上游服务器的期望,因为这是通过 DO 上的 http 对 s3 存储(对象存储)的调用。
有没有办法诊断错误来自何处,如果错误来自上游服务器,如何让用户在将 $proxy_host 传递到上游时仍在其浏览器中获取相同的 url?
将 $proxy_host 传递给上游是否会影响用户的浏览器?通过什么机制?它是否不仅会影响上游服务器的内容?为什么浏览器行为会改变?请问有人可以解释一下这种行为吗?提前谢谢您。
*编辑-根据要求包括以下完整的服务器上下文:
server {
listen 80;
server_name example.com;
location / {
rewrite ^(.*)/$ $1/index.html break;
rewrite ^(.*/[^./]+)$ $1/index.html break;
proxy_set_header Host $proxy_host;
proxy_pass http://someotherexample.com;
}
}
答案1
谜题解开了!在此发布,以便将来能帮助到遇到类似情况的人……
问题在于 https '升级' 自动发生在上游并设置了 hsts 标头。这些标头被传递到客户端浏览器,迫使它使用 https 发出另一个请求,而我在端口 80 上监听的服务器块无法处理该请求 - 从而导致异常。
我将 proxy_pass 调用更改为 https,这解决了该问题,因为上游不再尝试通过发送标头来强制执行 https,这会导致客户端出现问题并执行意外操作。现在我的客户端浏览器仍在执行 http 调用,这是我们作为整体设计的一部分所希望的,我们在浏览器中获得了我们想要的内容,同时仍在浏览器中获取正确的内容,而无需在浏览器中显示上游 url。
答案2
这与代理配置无关,显然是在上游配置的。
一般来说,您的初始帖子包含几个问题,因此您应该将它们分成多个问题。其中大部分问题只需打开股票文档即可回答http://nginx.org/en/docs/。