我有一个重定向循环问题,该网站由 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¶ms%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;
}