防止redirect到https和URI hack nginx反向代理

我已经在我的服务器上设置了一个反向代理服务器,在docker中有nginx,从那以后,所有的请求都被redirect到https,尽pipe我没有把所有的位置设置为httpsredirect。

基本上我想要的是能够同时服务https和http与反向代理。 另外,我希望能够dynamicredirect到不同的URI,例如我想设置/ bla2 / foo / bar的所有路由只被redirect到/ bla2之后我试图得到的是每当访问example.com/bla2/foo/bar它应该redirect到example.com/foo/bar没有bla2部分…

  1. 它可能在同一个configuration文件?
  2. 什么可以导致我的服务器将所有请求redirect到https

这是我的服务器nginx.conf

server { listen 443; ssl on; ssl_certificate /etc/ssl/example.com.crt; ssl_certificate_key /etc/ssl/example.com.key; listen 80; server_name example.com; location /bla/bla { proxy_pass http://example.com:3980/foo/bar1; } **location /bla2/**{ # proxy_pass http://example.com:3004; return 301 http://example.com:3004$request_uri; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-Proto $scheme; } location /app3 { rewrite ^/app3(.*) /$1 break; proxy_pass http://example.com:1236/app3; } } 

我希望能够直接获取http://example.com:3004的内容,如果我把它放在浏览器中而不redirect到https。 只有当我尝试访问example.com/bla2我希望它需要https而不是http,并被redirect到不同的path。

您需要为此使用正则expression式和捕获组

 location ~* /bla2/(.*) { return 301 http://example.com:3004$1$is_args$args; } 

另一种做法是使用重写

 rewrite ^/bla2/(.*)$ http://example.com:3004/$1 redirect; 

如果你想透明地代理它example.com:3004删除/bla2那么你应该使用

 location /bla2/ { proxy_pass http://example.com:3004/; } 

尾部的斜杠/ in /bla2/http://example.com:3004/在这里非常重要