nginx重写导致重定向循环

时间:2012-02-14 05:05:27

标签: django ssl nginx

我在本地使用带有反向代理的nginx到我的gunicorn django服务器来运行我的django应用程序。

我正在尝试强制来自任何http请求的ssl,因为该网站仅用于https访问。该应用程序只能侦听端口8888(80和443),因此只有在指定8888端口时才能访问该站点。

我尝试在服务器块和位置块中使用此rewrite ^ https://domain.net:8888$request_uri? permanent;重写。它不仅不会将http请求重定向到同一个URL,而且还会在有https请求时导致重定向循环。

server {
    listen 8888;
    server_name sy-system.net;
    rewrite ^ https://domain.net:8888$request_uri? permanent;

    ssl on;
    ssl_certificate /path/to/domain.pem;
    ssl_certificate_key /path/to/domain.key;

    # serve directly - analogous for static/staticfiles
    location /media/ {
        root /path/to/root;
    }

    location /static/ {
        root /path/to/root;
    }

    location / {
        #rewrite ^ https://sy-system.net:8888$request_uri? permanent;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://127.0.0.1:8881/;
        proxy_set_header X-Forwarded-Protocol https;
   }
    # what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /media/50x.html;
}

1 个答案:

答案 0 :(得分:2)

您无条件地从domain.net:8888重定向到domain.net:8888。无限重定向循环是唯一可能的结果。

在任何情况下,您尝试做的事情都是不可能的。 Nginx正在谈论SSL,你的浏览器不是,因此它们之间不会传输数据(这就是为什么你在使用普通HTTP连接时没有获得重定向循环的原因)。当他们说话时(通过SSL)你的重定向循环接管。