Nginx配置导致无限重定向循环

时间:2011-01-06 15:26:55

标签: ssl nginx ruby-on-rails-3 passenger

所以我查看了我能找到的每个示例配置,但每当我尝试查看需要ssl的页面时,我最终都会进行重定向循环。我正在运行nginx / 0.8.53和乘客3.0.2。

这是ssl config

server  {
  listen 443 default ssl;
  server_name <redacted>.com www.<redacted>.com;
  root /home/app/<redacted>/public;
  passenger_enabled on;
  rails_env production;  
  ssl_certificate      /home/app/ssl/<redacted>.com.pem;
  ssl_certificate_key  /home/app/ssl/<redacted>.key;

  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X_FORWARDED_PROTO https;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header  Host $http_host;
  proxy_set_header  X-Url-Scheme $scheme;
  proxy_redirect    off;
  proxy_max_temp_file_size 0;

  location /blog {
    rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    if (-f $request_filename) {
      expires      max;
      break;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

这是非ssl配置

server  {
  listen 80;
  server_name <redacted>.com www.<redacted>.com;
  root /home/app/<redacted>/public;
  passenger_enabled on;
  rails_env production;  

  location /blog {
    rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    if (-f $request_filename) {
      expires      max;
      break;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

如果我有任何其他信息可以帮助我诊断问题,请告诉我。

9 个答案:

答案 0 :(得分:31)

这是你的界限:

  listen 443 default ssl;

将其更改为:

listen 443;
ssl on;

这我称之为旧式。 此外,还有

              proxy_set_header X_FORWARDED_PROTO https;
              proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header  Host $http_host;
              proxy_set_header  X-Url-Scheme $scheme;
              proxy_redirect    off;
              proxy_max_temp_file_size 0;

为我做了诀窍。我现在看到我错过了你所拥有的真实IP线路,但到目前为止,这已经摆脱了ssl_requirement和ssl_enforcer的无限循环问题。

答案 1 :(得分:6)

我发现这就是这条线

 proxy_set_header  Host $http_host;

哪个应改为

 proxy_set_header  Host $host;

According to the nginx documentation使用'$ http_host传递“未更改的请求标头”。

答案 2 :(得分:5)

答案 3 :(得分:4)

由于您在ssl和非ssl部分都找到了重写语句

location /blog {
  rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
}

blog..com的服务器部分在哪里?这可能是问题的根源吗?

答案 4 :(得分:3)

我的symfony2应用程序遇到了类似的问题,虽然形成了一个不同的原因:当我在我的nginx配置中需要fastcgi_param HTTPS off;时,我设置了fastcgi_param HTTPS on;

    location ~ ^/(app|app_dev|config)\.php(/|$) {
            satisfy any;
            allow all;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param HTTPS on;
    }

答案 5 :(得分:1)

如果其他人偶然发现这一点,我试图通过同一个服务器{}块配置http和https,但只添加了“listen 443”指令,认为“此行是默认的和隐含的”意味着它也会听80,但事实并非如此。取消注释“listen 80”行,以便两个监听行都存在,从而纠正了无限循环。不知道为什么它甚至会得到重定向,但确实如此。

答案 6 :(得分:1)

对于那些正在绝望地搜索为什么他们自己的云仍然在进行重定向循环但仍然有一个好的配置文件的人,我已经找到了它为什么不工作。

我的配置: nginx + php-fpm + mysql上新鲜的centos 6.5

安装php-fpm和nginx时,/ var / lib / php / session /的默认权限是root:apache

php-fpm通过nginx存储php会话在这里,如果nginx没有授权写入它会失败,以保持任何登录会话,导致无限循环。

所以juste在apache组中添加nginx(usermod -a -G apache nginx)或更改此文件夹的所有权。

度过愉快的一天。

答案 7 :(得分:0)

X_FORWARDED_PROTO在您的文件中可能会导致错误,而且在我的情况下也是如此。 X-Forwarded-Proto是正确的,而hiphens比大写或小写字母更重要。

您可以通过坚持惯例来避免这些问题;)

另请参阅此处:Custom HTTP headers : naming conventions和此处:http://www.ietf.org/rfc/rfc2047.txt

答案 8 :(得分:0)

我玩弄了很多这样的答案,但没有任何帮助。然后我意识到,由于我使用Cloudflare,因此问题可能不在于服务器,而在于Cloudflare。当我将SSL设置为Full (Strict)时,请注意,一切正常!

cloudflare ssl