Nginx伪静态重定向干货分享

在网站建设中需要网页重定向的情况很多:如网页目录结构变动、网页重命名、网页的扩展名改变、网站域名改变等。如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个404错误信息页面降低了用户体验度,导致访问流量白白丧失。不仅如此,之前该页面的一切积累(比如PR值)就都白费了。

WebServer的301重定向不仅能使页面实现自动跳转,对于搜索引擎来说,也可以传递PR值。

案例一:将多个域名指向同一web目录

server_name www.markdream.com markdream.com;
rewrite ^/$ / redirect;

 

案例二:将不带www的域名301转向到带www的域名

server_name www.markdream.com markdream.com;

if ( $host != "www.markdream.com" ) {
    rewrite ^/(.*)$ http://www.markdream.com/$1 permanent;
}

 

nginx重定向规则详细介绍

rewrite命令

nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令格式如下:

rewrite 正则表达式 替换目标 flag标记

flag标记可以用以下几种格式:

last – 基本上都用这个Flag。

break – 中止Rewirte,不在继续匹配

redirect – 返回临时重定向的HTTP状态302

permanent – 返回永久重定向的HTTP状态301

 

例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,$2对应第二个括号(.*)中对应的字符串:

location /download/ {

  	rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break;

}

 

nginx重定向的IF条件判断

在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种:

正则表达式

匹配判断
	
~ 为区分大小写匹配; !~为区分大小写不匹配

~* 为不区分大小写匹配;!~为不区分大小写不匹配

 

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) {

  	rewrite ^(.*)$ /nginx-ie/$1 break;

  }

 

文件和目录判断

-f和!-f判断是否存在文件

-d和!-d判断是否存在目录

-e和!-e判断是否存在文件或目录

-x和!-x判断文件是否可执行

 

例如下面设定nginx在文件和目录不存在的时候重定向:

if (!-e $request_filename) {

  	proxy_pass http://127.0.0.1/;

}

 

return 返回代码

返回http代码,例如设置nginx防盗链:

location ~* \.(gif|jpg|png|swf|flv)$ {

    valid_referers none blocked http://www.markdream.com/ http://www.markdream.cc/;

    if ($invalid_referer) {

	  	return 404;
     }

}

 

301重定向方法

进行了301重定向,把www.markdream.com和php100.com合并,并把之前的域名也一并合并. 有两种实现方法,第一种方法是判断nginx核心变量host(老版本是http_host):

  server {

	  server_name markdream.com;

	  rewrite ^/(.*) http://www.markdream.com/$1 permanent;
  }

 

nginx rewrite伪静态配置参数详细说明

正则表达式匹配

* ~ 为区分大小写匹配 
* ~* 为不区分大小写匹配 
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

 

文件及目录匹配

* -f和!-f用来判断是否存在文件 
* -d和!-d用来判断是否存在目录 
* -e和!-e用来判断是否存在文件或目录 
* -x和!-x用来判断文件是否可执行

 

flag标记

* last 相当于Apache里的[L]标记,表示完成rewrite 
* break 终止匹配, 不再匹配后面的规则 
* redirect 返回302临时重定向 地址栏会显示跳转后的地址 
* permanent 返回301永久重定向 地址栏会显示跳转后的地址

 

一些可用的全局变量有,可以用做条件判断

$args 
$content_length 
$content_type 
$document_root 
$document_uri 
$host 
$http_user_agent 
$http_cookie 
$limit_rate 
$request_body_file 
$request_method 
$remote_addr 
$remote_port 
$remote_user 
$request_filename 
$request_uri 
$query_string 
$scheme 
$server_protocol 
$server_addr 
$server_name 
$server_port 
$uri

 

结合QeePHP的例子

if (!-d $request_filename) { 
	rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last; 
	rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last; 
	break;

 

多目录转成参数

#abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
	if ($host ~* (.*)\.domain\.com) { 
		set $sub_name $1; 
		rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last; 
	}

 

目录对换

#123456/xxxx -> /xxxx?id=123456
	rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
	#例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:
	if ($http_user_agent ~ MSIE) { 
		rewrite ^(.*)$ /nginx-ie/$1 break; 
	}

 

目录自动加“/”

if (-d $request_filename){ 
		rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
	}

 

禁止htaccess

location ~/\.ht { 
     deny all; 
}

 

禁止多个目录

location ~ ^/(cron|templates)/ { 
	deny all; 
	break; 
}

 

禁止以/data开头的文件

#可以禁止/data/下多级目录下.log.txt等请求;
	location ~ ^/data { 
		deny all; 
	}

 

禁止单个目录不能禁止.log.txt能请求

location /searchword/cron/ { 
	deny all; 
}

 

禁止单个文件

location ~ /data/sql/data.sql { 
	deny all; 
}

 

给favicon.ico和robots.txt设置过期时间

#这里为favicon.ico为99 天,robots.txt为7天并不记录404错误日志
location ~(favicon.ico) { 
	log_not_found off; 
	expires 99d; 
	break; 
}

location ~(robots.txt) { 
	log_not_found off; 
	expires 7d; 
	break; 
}

 

设定某个文件的过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js { 
	access_log off; 
	root /opt/nginx/htdocs; 
	expires 600; 
	break; 
}

 

文件反盗链并设置过期时间

#这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
#rewrite ^/ http://leech.markdream.com/leech.gif;显示一张防盗链图片
#access_log off; 不记录访问日志,减轻压力
#expires 3d 所有文件3天的浏览器缓存
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 
	valid_referers none blocked *.markdream.com *.markdream.net localhost 208.97.167.194; 
	if ($invalid_referer) { 
		rewrite ^/ http://leech.markdream.com/leech.gif; 
		return 412; 
		break; 
	}
	access_log off; 
	root /opt/lampp/htdocs/web; 
	expires 3d; 
	break; 
}

 

只允许固定ip访问网站,并加上密码

root /opt/htdocs/www; 
allow 208.97.167.194; 
allow 222.33.1.2; 
allow 231.152.49.4; 
deny all; 
auth_basic "C1G_ADMIN"; 
auth_basic_user_file htpasswd;

 

将多级目录下的文件转成一个文件,增强seo效果

#/job-123-456-789.html 指向/job/123/456/789.html
rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

 

将根目录下某个文件夹指向2级目录

#如/shanghaijob/ 指向 /area/shanghai/
#如果你将last改成permanent,那么浏览器地址栏显是 /location/shanghai/
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

 

上面例子有个问题是访问/shanghai 时将不会匹配

rewrite ^/([0-9a-z]+)job$ /area/$1/ last; 
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

 

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,如./list_1.html真实地址是/area /shanghia/list_1.html会变成/list_1.html,导至无法访问。
那我加上自动跳转也是不行咯(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

if (-d $request_filename){ 
    rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
}

 

知道原因后就好办了,让我手动跳转吧

rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; 
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

 

文件和目录不存在的时候重定向:

if (!-e $request_filename) { 
    proxy_pass http://127.0.0.1; 
}

 

域名跳转

server { 
	listen 80; 
	server_name jump.markdream.com; 
	index index.html index.htm index.php; 
	root /opt/nginx/htdocs; 
	rewrite ^/ http://www.markdream.com/; 
	access_log off; 
}

 

多域名转向

server_name www.markdream.com www.markdream.net; 
index index.html index.htm index.php; 
root /opt/lampp/htdocs; 
if ($host ~ "markdream\.net") { 
	rewrite ^(.*) http://www.markdream.com$1 permanent; 
}

 

三级域名跳转

if ($http_host ~* "^(.*)\.i\.markdream\.com$") { 
	rewrite ^(.*) http://top.yingjiesheng.com$1; 
	break; 
}

 

域名镜像

server { 
	listen 80; 
	server_name mirror.markdream.com; 
	index index.html index.htm index.php; 
	root /opt/lampp/htdocs/www; 
	rewrite ^/(.*) http://www.markdream.com/$1 last; 
	access_log off; 
}

 

某个子目录作镜向

location ^~ /zhaopinhui { 
	rewrite ^.+ http://zph.markdream.com/ last; 
	break; 
}
#discuz ucenter home (uchome) rewrite
rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 last; 
rewrite ^/(space|network)\.html$ /$1.php last; 
rewrite ^/([0-9]+)$ /space.php?uid=$1 last;
discuz 7 rewrite
rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last; 
rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last; 
rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 last; 
rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last; 
rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last; 
rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;

 

给discuz某版块单独配置域名

server_name bbs.markdream.com news.markdream.com; 

location = / { 
	if ($http_host ~ news\.markdream.com$) { 
		rewrite ^.+ http://news.markdream.com/forum-831-1.html last; 
		break; 
	}
}

 

discuz ucenter 头像 rewrite 优化

location ^~ /ucenter { 
	location ~ .*\.php?$ 
	{ 
	#fastcgi_pass unix:/tmp/php-cgi.sock; 
	fastcgi_pass 127.0.0.1:9000; 
	fastcgi_index index.php; 
	include fcgi.conf; 
	} 
	location /ucenter/data/avatar { 
	log_not_found off; 
	access_log off; 
	location ~ /(.*)_big\.jpg$ { 
	error_page 404 /ucenter/images/noavatar_big.gif; 
	} 
	location ~ /(.*)_middle\.jpg$ { 
	error_page 404 /ucenter/images/noavatar_middle.gif; 
	} 
	location ~ /(.*)_small\.jpg$ { 
	error_page 404 /ucenter/images/noavatar_small.gif; 
	} 
	expires 300; 
	break; 
	} 
}

 

选择跳转目录到域名

#www.markdream.com/news/te111.html -->news.markdream.com/te111.html
#排除dongtai、about文件夹
location / {
	if ($request_uri !~ ^/(dongtai|about)/) {
		rewrite /(\w*)/(.*) http://$1.markdream.com/$2 break;
	}
   }

 

via : https://www.markdream.com/

配置nginx在同域名下的http/https有选择访问

生产环境中,遇到了这样一个需求,http://www.domain.com默认对所有用户开放,http://www.domain.com/login是用户登录网站的入口,大家都知道http是没有加密的,对于帐号这类的敏感信息一定要妥善处理,https出来就是解决这个问题的。具体的你可以参考豆瓣网站,用户POST提交的url是HTTPS的,你可以打开debug工具进行跟踪,这里就不多说这个问题了。

我现在处理的思路是这样的,https直接代理http(因为都在一个域中,访问效果都是一样的,不一样的就是端口而已(80、443)),为了简便阐述问题,我https做http的代理,我认为这个是我的最优解,起码我在网上还没有找到有关这方面的资料,好,我直接贴上nginx配置文件参考。

test.conf

#https proxy
server {
        listen       443 ssl;
        server_name  www.domain.com;

        ssl on;
        ssl_certificate /usr/local/nginx/conf/vhost/safekey/www.domain.crt;
        ssl_certificate_key /usr/local/nginx/conf/vhost/safekey/www.domain.key;

        location / {

			#参数需求  只代理http://www.domain.com/?g=admin&m=index&a=login&do=1进行HTTPS传输
			if ( $args !~ g=admin&m=index&a=login&do=1)
			{
				rewrite (.*) http://www.domain.com$1 permanent;
			}

			#uri需求 可以注释。 如果是http://www.domain.com/login 使用HTTPS传输
			if ( $request_uri !~ /login.*$)
			{
				rewrite (.*) http://www.domain.com$1 permanent;
			}

			#如果上面的条件没有满足 就全权代理http 即我们看到的https://www.domain.com
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://www.domain.com;
        }
}

#普通http
server {
        listen       80;
        server_name  www.domain.com;
        root /home/vhost/domain;
		index  index.html index.htm index.php;

        access_log  logs/access.domain.log;
        error_log logs/error.domain.log;

        location / {
        }

        error_page   404 403 402 500 502 503 504  /404.html;
        location = /404.html {
        }

        location ~ \.php$ {
           fastcgi_pass   127.0.0.1:9000;
           try_files $uri =404;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
           include        fastcgi_params;
        }
}

 

这个是我生产环境下版本,你可以参考,不求完美,只有实用,如果您有更好的建议,请与我联系。关于更多nginx方面的资料,请参阅这里。程序员没有什么会不会的,只有不肯学的。

Nginx 服务器配置上更安全的 SSL

经过测试, CSR 的 SHA1 加密不影响生成的证书用 SHA256 加密!
CSR 的 SHA1 加密不影响生成的证书用 SHA256 加密!
CSR 的 SHA1 加密不影响生成的证书用 SHA256 加密!

重要的话说三遍!

申请完 SSL 证书,应该有以下几样东西

  • private.key 私钥
  • cert.csr CSR
  • www_pupboss.crt 公钥
  • xxxx.crt 证书商的中级证书和根证书

首先把证书商提供的根证书中级证书添加到自己的证书后面,不然有的浏览器可能报错,我的习惯是域名证书 + 中级证书 + 根证书,别的顺序不知道行不行。

当然这些是最初级的,下面来点高级的东西,先上臭美图两张:

现在服务器采用了 SNI 技术,安装了多个 SSL 证书,所以 chrome 下会有黄色警告

  • Chrome 浏览器显示结果

 

  • SSL Labs 测试结果

  • 测试地址:SSL Labs

    SSL 协议

    SSLv2 是不安全的,绝对不能用,SSLv3 能不用则不用,正常情况下用不到的,推荐使用TLSv1 TLSv1.1 TLSv1.2,附配置代码:

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

     

    加密算法

    RC4 不要用,再就是 OpenSSL 记得更新到最新版,可以避免很多麻烦。别的也没什么了,附代码:

    ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    
    ssl_prefer_server_ciphers on;

     

    如果你的 OpenSSL 版本比较旧,不可用的加密算法会被自动丢弃。最好使用完整套件,让 OpenSSL 自动选择。所以套件的顺序就灰常重要

    • ECDHE+AESGCM 加密是首选的。它们是 TLS 1.2 加密算法,现在还没有广泛支持。当然也没有破解的方案。
    • PFS 加密套件好一些,首选 ECDHE,然后是 DHE。
    • AES 128 要好于 AES 256。AES 256 会造成更大的性能消耗,但是带来的安全提升是有限的。反之还能承受更大压力。
    • 在向后兼容的加密套件里面,AES 要优于 3DES。在 TLS 1.1及其以上,减轻了针对 AES 的野兽攻击(BEAST)的威胁,而在 TLS 1.0上则难以实现该攻击。在非向后兼容的加密套件里面,不支持 3DES。
    • RC4 整个不支持了。3DES 用来向后兼容。

    强制丢弃的算法

    • aNULL 包含了非验证的 Diffie-Hellman 密钥交换,这会受到中间人(MITM)攻击
    • eNULL 包含了无加密的算法(明文)
    • EXPORT 是老旧的弱加密算法,是被美国法律标示为可出口的
    • RC4 包含使用了已弃用的 ARCFOUR 的加密算法
    • DES 包含使用了弃用的数据加密标准(DES)的加密算法
    • SSLv2 包含了定义在旧版本 SSL 标准中的所有算法,现已弃用
    • MD5 包含了使用已弃用的 MD5 的所有算法

    前向安全性(Forward Secrecy)

    首先 Nginx 配置上如下代码:

    ssl_dhparam /your/path/to/dhparam.pem;

    pem 文件是这样生成的:

    openssl dhparam -out dhparam.pem 4096

     

    然后会显示

    This is going to take a long time  
    .......+...........................+............................+............................+............++*++*++*

     

    当时这个命令,VPS 上单核执行了 100 分钟,我的电脑 i7 4750HQ 处理器,只能跑一个核,用了大概 70 分钟,VPS 上生成的 ..+… 字符数大概在 50000 个,我的电脑产生了 74900 多个,不知道什么原因

    以下内容来自 @justwd 的邮件:

    dhparam 算法是在 2^4096 个数字中找出两个质数,所以需要的时间挺长。`.....` 意思是有可能的质数,`+` 是正在测试的质数,`*` 是已经找到的质数。

    前向安全性(Forward Secrecy)的概念很简单:客户端和服务器协商一个永不重用的密钥,并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接,并且只用在一个限定的时间内,所以称作短暂模式(Ephemeral)。

    如果使用前向安全机制,攻击者取得了一个服务器的私钥,他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名,并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器,而且不能被中间人攻击所拦截。

    所有版本的 nginx 都依赖于 OpenSSL 给 Diffie-Hellman 的输入参数。如果不特别声明,将使用 OpenSSL 的默认设置,1024 位密钥。这绝壁是不安全的,因为我们正在使用 2048 位证书,所以要有一个更强大的 DH

    HTTP 严格传输安全(HSTS)(HTTP Strict Transport Security)

    add_header Strict-Transport-Security max-age=15768000;

     

    接下来的半年,都会保持直接发送 HTTPS。

    配置 OCSP 装订

    正常情况下,如果你配置的 ssl_certificate 字段包含 CA ROOT 根证书CA 中级证书,在监听 443 的代码块中加上:

    ssl_stapling on;  
    ssl_stapling_verify on;  
    resolver 8.8.8.8 8.8.4.4 valid=300s;  
    resolver_timeout 5s;

     

    即可,如果没有的话,需要自己创建一个根证书和二级证书的列表,再加上如下代码:

    ssl_trusted_certificate /you/path/to/domain.chain.stapling.pem;

     

    连接到一个服务器时,客户端应该使用证书吊销列表(CRL)或在线证书状态协议(OCSP)记录来校验服务器证书的有效性。CRL 存在一个问题,它已经增长的太快,永远也下载不完。

    OCSP 更轻量一些,只需发一个请求。但是副作用是访问一个站点时必须对第三方 OCSP 响应服务器发起 OCSP 请求,这就增加了延迟带来的潜在隐患。事实上,CA 所运营的 OCSP 响应服务器非常不可靠,浏览器如果不能及时收到答复,就会静默失败。攻击者通过 DDoS 攻击一个 OCSP 响应服务器可以禁用其校验功能,这样就降低了安全性。

    解决方法是允许服务器在 TLS 握手中发送缓存的 OCSP 记录,以绕开 OCSP 响应服务器。这个机制减少了客户端和 OCSP 响应服务器之间的通讯,称作 OCSP 装订。

    客户端会在它的 CLIENT HELLO 中告知其支持 status_request TLS 扩展,服务器仅在客户端请求它的时候才发送缓存的 OCSP 响应。

    大多数服务器最长会缓存 OCSP 48 小时。服务器会按照常规的间隔连接到 CA 的 OCSP 响应服务器来获取刷新的 OCSP 记录。OCSP 响应服务器的位置可以从签名的证书中 Authority Information Access 字段中获得。

    我的服务器是这么配置的:

    server {
    
        listen 80;
        listen 443 ssl;
        server_name pupboss.com;
        client_max_body_size 10M;
    
        ssl_certificate     /etc/nginx/ssl/www_pupboss.crt;
        ssl_certificate_key /etc/nginx/ssl/private.key;
    
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 5m;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;
    
        add_header Strict-Transport-Security max-age=15768000;
    }

     

常情况下,这样配置完之后,测试就会显示 A+ 了。

不过这样配置完的还有问题,首先是 Nginx 重启需要密码,再就是没法强制 HTTPS,可以阅读这篇文章来解决这个问题:

重启免密码

Nginx 里面的配置还是老样子,不过有个问题就是重启 Nginx 的时候会要求输入密码,可以有个办法免输密码。敲入如下指令:

openssl rsa -in pupboss.key -out pupboss_unsecure.key

 

然后 Nginx 中相应的路径后缀改为 pupboss_unsecure.key 就 OK 了。

强制 HTTPS

加上如下代码

server {

    listen 80;
    server_name pupboss.com;
    return 301 https://$server_name$request_uri;
}

 

via: pupboss.com