Nginx不断无限地重定向



我已经按照此处的说明设置nginx将所有非www请求重定向到www,但是当我尝试点击任何页面时,我的浏览器不断ERR_TOO_MANY_REDIRECTS

我的目标是双重的:

  1. 所有没有 www 的请求都应重定向到 www
  2. 所有不是 HTTPS 的请求都应重定向到 HTTPS

我的nginx配置看起来像这样:

upstream mywebsite_proxy {
  server unix:/home/deploy/mywebsite/tmp/sockets/puma.sock;
}
server {
  listen   80;
  listen   [::]:80;
  listen   443 default_server ssl;
  server_name www.mywebsite.com;
  if ($scheme = http) {
    return 301 https://$server_name$request_uri;
  }
  location / {
    proxy_pass http://mywebsite_proxy;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  location ~ ^/(robots.txt|sitemap.xml.gz)/  {
    root /home/deploy/mywebsite/public;
  }
}

请注意,没有任何对 SSL 证书的引用。我正在使用启用了SSL的Cloudflare,当我的配置看起来像下面的配置时,HTTPS似乎就可以正常工作。非 www 到 www 和非 http 到 https 重定向显然不起作用......

upstream mywebsite_proxy {
  server unix:/home/deploy/mywebsite/tmp/sockets/puma.sock;
}
server {
  listen 80;
  listen 443;
  server_name www.mywebsite.com mywebsite.com;
  root /home/deploy/mywebsite/public;
  location / {
    proxy_pass http://mywebsite_proxy;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  location ~ ^/(robots.txt|sitemap.xml.gz)/  {
    root /home/deploy/mywebsite/public;
  }
}
在我看来,

您不需要以下部分中的 if 部分:

if ($scheme = http) {
    return 301 https://$server_name$request_uri;
  }

重定向应如下所示:

    return 301 https://$server_name$request_uri;
如果要

执行永久重定向,请使用 301,该重定向将存储在浏览器的缓存中,如果您不希望它是永久性的,请使用 302。此外,您可以删除 www。部分server_name并使用return 301 https://www.$server_name$request_uri;<</p>

div class="one_answers">

我在以前的一个项目中做了一些类似的事情,以下是步骤:

  1. 保留默认配置"nginx.conf",原样。
  2. 修改/etc/nginx/sites-available/default(要点:https://gist.github.com/faizulhaque-tp/db576dc6f22c820a0e23f7a6e1c8b740(

除了非 www 到 www 之外,上述配置有效。

最新更新