防止重定向到https和URI黑客nginx反向代理

时间:2017-10-12 09:30:45

标签: redirect docker nginx reverse-proxy

我在我的服务器上设置了一个反向代理,其中包含了docker中的nginx,从那时起所有请求都重定向到https,尽管我没有将所有位置都设置为https重定向。

基本上我想要的是能够使用反向代理服务https和http。 另外我希望能够动态地重定向到不同的URI,例如我想将/ bla2 / foo / bar的所有路由设置为仅重定向到/ bla2之后的内容 我试图访问的是,无论何时访问example.com/bla2/foo/bar,它都应该将其重定向到example.com/foo/bar而不使用 bla2 部分......

  1. 是否可以在同一配置文件中使用?
  2. 什么可能导致我的服务器将所有请求重定向到https
  3. 这是我的服务器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;
            }
    }
    

    如果我将其放入浏览器而不重定向到https,我希望能够直接获得 http://example.com:3004 的内容。 只有当我尝试访问 example.com/bla2 时,我希望它是必需的https而不是http,并被重定向到不同的路径。

1 个答案:

答案 0 :(得分:1)

您需要为此

使用正则表达式和捕获组
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/;
}

//bla2/中的尾部斜杠http://example.com:3004/非常重要