首页 文章

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

提问于
浏览
0

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

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

  • 是否可以在同一配置文件中?

  • 什么可能导致我的服务器将所有请求重定向到https

This is my server 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 回答

  • 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/ 中的尾部斜杠 / 在这里非常重要

相关问题