我已经按照此处的说明设置nginx将所有非www请求重定向到www,但是当我尝试点击任何页面时,我的浏览器不断ERR_TOO_MANY_REDIRECTS
。
我的目标是双重的:
- 所有没有 www 的请求都应重定向到 www
- 所有不是 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>
我在以前的一个项目中做了一些类似的事情,以下是步骤:
- 保留默认配置"nginx.conf",原样。
- 修改/etc/nginx/sites-available/default(要点:https://gist.github.com/faizulhaque-tp/db576dc6f22c820a0e23f7a6e1c8b740(
除了非 www 到 www 之外,上述配置有效。