2024年4月28日发(作者:)
概述
一般来说,给站点申请了安全证书以后,都会希望访问者强制使用
HTTPS来进行连接。HTTP强制跳转HTTPS通常有两种方法,一种是
对整个域名使用正则表达式来进行rewrite重写,另外一种是通过301
跳转来处理。Nginx官方并不推荐前者,其原文如下:
1
# 不好的方法:
2 rewrite ^/(.*)$ /$1 permanent;
3
# 好的方法:
4 rewrite ^ $request_uri? permanent;
5
# 更好的方法:
6 return 301 $request_uri;
因此,对于HTTP强制跳转HTTPS的语句,应当写成:
1 return 301 $server_name$request_uri;
默认配置
对于自己手动编译安装的Nginx,其默认配置文件
将80端
口和443端口(默认被注释)的监听分别写进了两个server段中,这
是一种非常符合生产环境的标准做法。因此,只需要将上述语句直接复
制到80端口对应的server段中,同时将该段中的location配置全部复
制到443端口对应的server段中即可。类似如下:
1
# https部分
2 server {
3 listen 443 ssl;
4 server_name ;
5
6 ssl_certificate /dir/;
7 ssl_certificate_key /dir/;
8 ssl_dhparam /dir/;
9
10 ssl_session_timeout 5m;
11
12 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
13 ssl_prefer_server_ciphers on;
14 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP;
15
16 location / {
17 root /your/wwwroot/;
18 index ;
19 }
20 }
21
# http部分
22 server {
23 listen 80;
24 server_name ;
25 return 301 $server_name$request_uri;
26 location / {
27 root /your/wwwroot/;
28 index ;
29 }
30
# http部分的location字段可保留可删除
31 }
LNMP环境配置
如果你的LNMP环境使用的是流行的一键安装包,那么问题就来了。这
个脚本生成的中没有443端口的server字段,因此在配置
SSL证书的时候,有些人为了省事,可能会直接将443端口的监听一起
写到server字段中,类似这种:
1 server
2 {
3 listen 80;
4 listen 443 ssl;
5 ssl_certificate /dir/;
6 ssl_certificate_key /dir/;
7 ssl_dhparam /dir/;
8 #listen [::]:80 default_server ipv6only=on;
9 server_name ;
10
11 index ;
12 root /your/wwwroot/;
13 }
那么如果你直接使用return 301 $server_name$request_uri; ,
由于443端口和80端口在同一个server段监听,就会产生内部无限循
环。当用户访问时,就会出现“重定向次数过多
(ERR_TOO_MANY_REDIRECTS)”的错误。
正确的方法,使用IF判定,只对HTTP连接进行重定向:
1 server
2 {
3 listen 80;
4 listen 443 ssl;
5 ssl_certificate /dir/;
6 ssl_certificate_key /dir/;
7 ssl_dhparam /dir/;
8 #listen [::]:80 default_server ipv6only=on;
9 server_name ;
10
11 if ( $scheme = http ){
12 return 301 $server_name$request_uri;
13 }
14
15 index ;
16 root /your/wwwroot/;
17 }
但Nginx官方并不推荐过多的IF判定,因此最好还是像Nginx默认配
置文件那样,将80端口和443端口的监听区分开,同时采用第一种跳
转方法,这也是更符合生产环境的一种做法。
发布评论