nginx 反向代理替换请求中的方括号

nginx 反向代理替换请求中的方括号

我有一个重定向循环问题,该网站由 nginx 1.2.1 反向代理。看起来以下是原因(我不知道如何解决)

使用 httpfox 检查网站,我的浏览器发送的请求如下所示:

https://www.acme.eu/acm/admin/gui_call.php?Object=admin@GuiAdminStartpage&Params[gui]=&action=&no_subtitle=1

我的 nginx 日志告诉我这个:

GET 1/acm/admin/gui_call.php?Object=admin@GuiAdminStartpage&params%252525252525252525252525255bgui%252525252525252525252525255d=&action=&no_subtitle=1 HTTP/1.1" HTTP/1.1" 301 486 "https://www.acme.eu/acm/ui/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1"

(这个过程不断重复,直到 Firefox 检测到循环)

在我看来,nginx 似乎以某种方式将“gui”周围的方括号分别更改为“252525252525252525252525252525b”和“252525252525252525252525252525d”。我假设因为脚本 gui_call.php 获得了错误的参数,所以它重定向到 /acm/ui。/acm/ui 使用错误的参数调用 gui_call.php,等等。

如果我的解释正确,我该如何阻止这种情况发生?如果不正确,这是怎么回事?

我的网站特定配置:

proxy_cache_path  /var/lib/nginx/proxy/cache/www.acme.eu levels=1:2 keys_zone=www.acme.eu-cache:8m max_size=2000m inactive=600m;
# http
server{
    server_name www.acme.eu;
    listen 80;
    access_log /var/log/nginx/access_www.acme.eu_80.log;
    error_log /var/log/nginx/error_www.acme.eu_80.log;
    proxy_cache www.acme.eu-cache;
    proxy_cache_valid  200 302  600m;
    proxy_cache_valid  404      10m;
    location  ~* \.(jpg|gif|png|css|js) {
            try_files $uri @proxy;
    }
    location @proxy {
            proxy_pass http://www.acme.eu;
    }
    location / {
            proxy_pass http://www.acme.eu;
    }       
}       
# https 
server{         
    server_name www.acme.eu;
    listen 443;
    ssl on; 
    ssl_certificate /etc/nginx/ssl/acme_eu.crt;
    ssl_certificate_key /etc/nginx/ssl/acme_eu.key;
    access_log /var/log/nginx/access_www.acme.eu_443.log;
    error_log /var/log/nginx/error_www.acme.eu_443.log;
    proxy_cache www.acme.eu-cache;
    proxy_cache_valid  200 302  600m;
    proxy_cache_valid  404      10m;
    location  ~* \.(jpg|gif|png|css|js) {
            try_files $uri @proxy;
    }
    location @proxy {
            proxy_pass http://www.acme.eu;
    }
    location / {
            proxy_pass http://www.acme.eu;
    }
}

常规配置

user www-data;
worker_processes 16;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    #error_log /var/log/nginx/error.log debug;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    index index.html index.htm ;

    ##
    # Proxy Settings
    ##
    proxy_temp_path /var/lib/nginx/proxy/tmp;
}

编辑:结果发现问题是这个网站强制使用 SSL,所以我需要定义一个使用 SSL 的后端。在后端使用 SSL 不是很有用,但那是另一个话题 :)

答案1

原来问题出在这个网站强制使用 SSL。因此,当后端尝试重定向到 SSL 时,nginx 一次又一次地尝试不使用 SSL,从而导致重定向循环。

显而易见的解决方案是将 SSL 保护放入 nginx 中并在后端禁用它。但由于我们仍在测试中,后端作为常规 Web 服务器投入生产,因此目前还不能这样做。

我所做的是定义一个使用 SSL 的后端。在我的位置中,我有

    location  ~* \.(jpg|gif|png|css|js) {
            try_files $uri @proxy;
    }
    location @proxy {
            proxy_pass https://backend-secure-all-apaches;
    }
    location / {
            proxy_pass https://backend-secure-all-apaches;
    }
    proxy_set_header Host $host;

请注意,proxy_set_header Host $host;这对于正确使用 SSL 非常重要。然后我定义后端如下:

    upstream backend-secure-all-apaches {
            server 17.123.22.25:443;
            server 17.123.22.26:443;
            server 17.123.22.27:443;
   }

相关内容