NGINX 如何强制 http 301 跳转到 https 网上的教程都是错误的

2015-08-21 17:25:52 +08:00
 miao
诸如
rewrite ^(.*)$ https://$host$1 permanent;
error_page 497 https://$host$uri?$args;
等规则试验了都不行
都会导致循环重定向
27703 次点击
所在节点    NGINX
28 条回复
closeid
2015-08-21 17:33:47 +08:00
如果使用上面两句,需要 http 和 https 独立成两个 server 。
SourceMan
2015-08-21 17:42:02 +08:00
server {
listen 80;
server_name xxx.com www.xxx.com;
rewrite ^(.*) https://xxx.com$1 permanent;
}
sy1989
2015-08-21 17:42:35 +08:00
if ($scheme = http ) {
rewrite ^(.*)$ https://$host$1 permanent;
}
Jat001
2015-08-21 17:44:52 +08:00
listen 80;
listen 443 ssl;

#下面两个一样的效果
if ($scheme = http ) {
return 301 https://$host$request_uri;
}

if ($server_port = 80 ) {
return 301 https://$host$request_uri;
}

#http://nginx.org/en/docs/http/ngx_http_ssl_module.html#errors
error_page 497 https://$host$request_uri;
Pastsong
2015-08-21 17:45:15 +08:00
listen 80;
listen 443;

if ($ssl_protocol = "") { rewrite ^ https://$server_name$request_uri? permanent; }
virusdefender
2015-08-21 17:55:47 +08:00
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;
....
}
TankyWoo
2015-08-21 18:28:43 +08:00
看标题还以为楼主发现了一个惊天 bug ,然后给出一个完美的配置方案

结果 ~~~

楼主有质疑精神是好事,但是你想想那么多人都是那么配的,有问题的概率还是比较小啊。你怎么就能这么果断的下结论呢?

我是直接写了两个 server, 然后一个 rewrite 做 301
lhbc
2015-08-21 18:47:26 +08:00
必须两个 server
如果只用一个 server ,然后用 if 判断协议或者端口
每个请求都必须执行一次 if ,这多蛋疼
salmon5
2015-08-21 19:01:57 +08:00
官方推荐 return 301,rewrite 复杂而且性能差。
ryd994
2015-08-21 20:15:38 +08:00
@Jat001
@sy1989
@Pastsong
if is evil,
明明 return 就好,rewrite 什么,没事 regex 很好玩么?
mchl
2015-08-21 20:17:12 +08:00
error_page 497 https://$server_name:$server_port$request_uri;
以上是从配置文件里直接粘贴出来的,版本 1.8.0
shierji
2015-08-21 20:33:52 +08:00
本来想回的。。不过上面都说的很好了。。
Bardon
2015-08-21 23:11:38 +08:00
@mchl
不懂,以下语句写入 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
mchl
2015-08-21 23:17:27 +08:00
@Bardon 哦,要把 listen 80 一行删掉,既然强制跳转 ssl ,为何还要 listen 80
mchl
2015-08-21 23:18:39 +08:00
@mchl 只要一个 server 配置
Bardon
2015-08-21 23:28:40 +08:00
@mchl 既然没有 listen 80;
但 http 默认为 80
curl 实测结果就是
curl: (7 ) Failed to connect to domain.com port 80: Connection refused
Bardon
2015-08-21 23:32:06 +08:00
@mchl 我测试的结果是
listen 443 spdy;
listen 80;
server_name domain.com;
......

error_page 497 https://$server_name:443$request_uri;

这样才行,必须告诉 nginx ,该域名的 80 端口也能访问进来
mchl
2015-08-21 23:37:46 +08:00
@Bardon 好吧,我这边网址比较特殊,端口不是默认的 80 和 443 ,访问网址必须指定端口, sorry
lzxgh621
2015-08-22 00:21:47 +08:00
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;
lzxgh621
2015-08-22 00:23:23 +08:00
单 server 一直正常 除非你的配置方式不是标准的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/214927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX