技术解析

NGINX 如何强制 http 301 跳转到 https 网上的教程都是错误的
0
2021-05-25 15:08:57
idczone
诸如
rewrite ^(.*)$ htt美国服务器ps://$host$1 permanent;
error_page 497 https://$host$uri?$args;
等规则试验了都不行
都会导致循环重定向
如果使用上面两句,需要 http 和 https 独立成两个 server 。

server {
listen 80;
server_name xxx.com www.xxx.com;
rewrite ^(.*) https://xxx.com$1 permanent;
}

if ($scheme = http ) {
rewrite ^(.*)$ https://$host$1 permanent;
}

listen 80;
listen 443 ssl;
/>if ($scheme = http ) {
return 301 https://$host$request_uri;
}
if ($server_port = 80 ) {
return 301 https://$host$request_uri;
}
/>error_page 497 https://$host$request_uri;

listen 80;
listen 443;
if ($ssl_protocol = "") { rewrite ^ https://$server_name$request_uri? permanent; }

server{
listen 80;
server_name virusdfefender.net;
return 301 https://virusdefender.net$request_uri;
}

server {
listen 443 ssl spdy;
ssl on;
server_name virusdfefender.net;
....
}

看标题还以为楼主发现了一个惊天 bug ,然后给出一个完美的配置方案
结果 ~~~
楼主有质疑精神是好事,但是你想想那么多人都是那么配的,有问题的概率还是比较小啊。你怎么就能这么果断的下结论呢?
我是直接写了两个 server, 然后一个 rewrite 做 301

必须两个 server
如果只用一个 server ,然后用 if 判断协议或者端口
每个请求都必须执行一次 if ,这多蛋疼

官方推荐 return 301,rewrite 复杂而且性能差。




if is evil,
明明 return 就好,rewrite 什么,没事 regex 很好玩么?

error_page 497 https://$server_name:$server_port$request_uri;
以上是从配置文件里直接粘贴出来的,版本 1.8.0

本来想回的。。不过上面都说的很好了。。


不懂,以下语句写入 443 的那个 server 中
error_page 497 https://$server_name:$server_port$request_uri;
告诉我, 80 那个端口怎么知道 497 状态?
curl 测试
$ curl -IL http://domain.com
curl: (7 ) Failed to connect to domain.com port 80: Connection refused

哦,要把 listen 80 一行删掉,既然强制跳转 ssl ,为何还要 listen 80

只要一个 server 配置

既然没有 listen 80;
但 http 默认为 80
curl 实测结果就是
curl: (7 ) Failed to connect to domain.com port 80: Connection refused

我测试的结果是
listen 443 spdy;
listen 80;
server_name domain.com;
......
error_page 497 https://$server_name:443$request_uri;
这样才行,必须告诉 nginx ,该域名的 80 端口也能访问进来

好吧,我这边网址比较特殊,端口不是默认的 80 和 443 ,访问网址必须指定端口, sorry

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

单 server 一直正常 除非你的配置方式不是标准的

return 301
当然有种更变态的方法就是开启 hsts 。。。

你贴的配置要工作,还漏了 ssl on;(顺带一提,这也是个已经废弃的选项)
希望你在复制粘贴前能先 STFW ,而不是祈祷网上随便找来的一段字符能工作。
如果你已经 Google 过,你应该明白:
497 是表示客户端用 HTTP 访问了一个应该用 HTTPS 的端口时返回的非标准状态。因此 497 法本身是个非标准&过时的 hack 。要使 497 法生效,就要把 80 端口故意错误的配置成 SSL 端口。这个方法只能挂一个站。
Again ,对 Nginx ,唯一正解就是两个 server 。 6 楼去掉那行 ssl on 就很好
http 访问时返回的 HSTS 是不生效的,至少 chrome 上是这样
回复前能先读读别人的回复么? if is evil 。何况根本没必要

不懂你什么意思
我确认我在 google 后,且经过实机测试的结果,你或学没有看到“...... ”,所以激动了?
如果你认为我只是个复制粘贴党,那么我们没有共同语言

重新看了篇,懂你意思了,分歧在非标准端口上
我的配置没问题

3 楼 4 楼已经给了答案

开 80 和 443 两个 server ,在 80 里用 return 301 就可以了
location / {
return 301 https://你的域名$request_uri;
}

有只监听一个端口的方法吗?

一个万年老贴帮了我,和楼主遇到一样的问题,重定向放在了同一个 server 导致重定向无法访问。
后来独立出来一个 server,却也没有生效。
突然意识到,应该把重定向的 server 放前面 :(
希望对后面搜索找寻答案的人有点帮助
server
{
listen 80;
server_name www.domain.com;
return 301 https://www.domain.com$request_uri;
}

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服