[英]Nginx does redirect, not proxy
我想將 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;
}
}
您必須使用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
如果您不希望服務器進行重定向,您可以像這樣設置 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 X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
對我來說,這個配置就足夠了:
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
返回 301s 以重定向到www.example.com
,NGINX 盡職盡責地鏡像這些 301s,然后 Firefox 直接“更改了 URL”(跟隨重定向)從localhost
到www.example.com
。
我遇到了類似的問題。 就我而言,我能夠通過向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/;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.