诸如
rewrite ^(.*)$ https://$host$1 permanent;
error_page 497 https://$host$uri?$args;
等规则试验了都不行
都会导致循环重定向
rewrite ^(.*)$ https://$host$1 permanent;
error_page 497 https://$host$uri?$args;
等规则试验了都不行
都会导致循环重定向

1 closeid Aug 21, 2015 如果使用上面两句,需要 http 和 https 独立成两个 server 。 |
2 SourceMan Aug 21, 2015 |
3 sy1989 Aug 21, 2015 if ($scheme = http ) { rewrite ^(.*)$ https://$host$1 permanent; } |
4 Jat001 Aug 21, 2015 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; |
5 Pastsong Aug 21, 2015 listen 80; listen 443; if ($ssl_protocol = "") { rewrite ^ https://$server_name$request_uri? permanent; } |
6 virusdefender Aug 21, 2015 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; .... } |
7 TankyWoo Aug 21, 2015 看标题还以为楼主发现了一个惊天 bug ,然后给出一个完美的配置方案 结果 ~~~ 楼主有质疑精神是好事,但是你想想那么多人都是那么配的,有问题的概率还是比较小啊。你怎么就能这么果断的下结论呢? 我是直接写了两个 server, 然后一个 rewrite 做 301 |
8 lhbc Aug 21, 2015 必须两个 server 如果只用一个 server ,然后用 if 判断协议或者端口 每个请求都必须执行一次 if ,这多蛋疼 |
9 salmon5 Aug 21, 2015 官方推荐 return 301,rewrite 复杂而且性能差。 |
10 ryd994 Aug 21, 2015 |
11 mchl Aug 21, 2015 via Android error_page 497 https://$server_name:$server_port$request_uri; 以上是从配置文件里直接粘贴出来的,版本 1.8.0 |
12 shierji Aug 21, 2015 本来想回的。。不过上面都说的很好了。。 |
13 xmgit Aug 21, 2015 @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 |
16 xmgit Aug 21, 2015 @mchl 既然没有 listen 80; 但 http 默认为 80 curl 实测结果就是 curl: (7 ) Failed to connect to domain.com port 80: Connection refused |
17 xmgit Aug 21, 2015 @mchl 我测试的结果是 listen 443 spdy; listen 80; server_name domain.com; ...... error_page 497 https://$server_name:443$request_uri; 这样才行,必须告诉 nginx ,该域名的 80 端口也能访问进来 |
19 lzxgh621 Aug 22, 2015 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; |
20 lzxgh621 Aug 22, 2015 单 server 一直正常 除非你的配置方式不是标准的 |
21 RAKE Aug 22, 2015 return 301 当然有种更变态的方法就是开启 hsts 。。。 |
22 ryd994 Aug 22, 2015 @Bardon 你贴的配置要工作,还漏了 ssl on;(顺带一提,这也是个已经废弃的选项) 希望你在复制粘贴前能先 STFW ,而不是祈祷网上随便找来的一段字符能工作。 如果你已经 Google 过,你应该明白: 497 是表示客户端用 HTTP 访问了一个应该用 HTTPS 的端口时返回的非标准状态。因此 497 法本身是个非标准&过时的 hack 。要使 497 法生效,就要把 80 端口故意错误的配置成 SSL 端口。这个方法只能挂一个站。 Again ,对 Nginx ,唯一正解就是两个 server 。 6 楼去掉那行 ssl on 就很好 @RAKE http 访问时返回的 HSTS 是不生效的,至少 chrome 上是这样 @lzxgh621 回复前能先读读别人的回复么? if is evil 。何况根本没必要 |
23 xmgit Aug 22, 2015 |
25 usernametoolong Aug 23, 2015 3 楼 4 楼已经给了答案 |
26 lazyyz Oct 4, 2015 开 80 和 443 两个 server ,在 80 里用 return 301 就可以了 location / { return 301 https://你的域名$request_uri; } |
27 q66213772 Apr 10, 2017 有只监听一个端口的方法吗? |
28 t5k5 Feb 5, 2020 一个万年老贴帮了我,和楼主遇到一样的问题,重定向放在了同一个 server 导致重定向无法访问。 后来独立出来一个 server,却也没有生效。 突然意识到,应该把重定向的 server 放前面 :( 希望对后面搜索找寻答案的人有点帮助 server { listen 80; server_name www.domain.com; return 301 https://www.domain.com$request_uri; } |