我想将Nginx设置为https服务的反向代理,因为我们有一个特殊的用例,我们需要" un-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;
}
}
答案 0 :(得分: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
答案 1 :(得分:1)
如果您不希望服务器进行重定向,您可以像这样设置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;
}
}
答案 2 :(得分:0)
对我来说,此配置已足够:
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直接从{{“更改了URL”(跟随重定向) 1}}到localhost
。
答案 3 :(得分:0)
我遇到了类似的问题。就我而言,我能够通过向 proxy_pass
网址添加尾部斜杠来解决该问题:
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/;
}
}