一般狀況下,咱們將用戶的 HTTP 請求 302 跳轉到 HTTPS,這會存在兩個問題:nginx
302 跳轉是由瀏覽器觸發的,服務器沒法徹底控制,這個需求致使了 HSTS(HTTP Strict Transport Security)的誕生。HTSP 就是添加 header 頭(add_header Strict-Transport-Security max-age=15768000;includeSubDomains),告訴瀏覽器網站使用 HTTPS 訪問,支持HSTS的瀏覽器(Chrome, firefox, ie 都支持了 HSTS(http://caniuse.com/#feat=stricttransportsecurity))就會在後面的請求中直接切換到 HTTPS。在 Chrome 中會看到瀏覽器本身會有個 307 Internal Redirect
的內部重定向。在一段時間內也就是max-age定義的時間,無論用戶輸入www.ttlsa.com仍是http://www.ttlsa.com,都會默認將請求內部跳轉到https://www.ttlsa.com。瀏覽器
服務器端配置HSTS,減小302跳轉,其實HSTS的最大做用是防止302 HTTP劫持。HSTS的缺點是瀏覽器支持率不高,另外配置HSTS後HTTPS很難實時降級成HTTP。安全
同時,也建議啓用SPDY來提升性能。有關SPDY內容參見前面文章,不在此外累述了。服務器
下面來講說如何在Apache2, NGINX , Lighttpd啓用HSTS。dom
1
2
3
4
5
6
|
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 0.0.0.0:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
|
而後,重啓Apache服務。ide
1
|
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
|
在server端添加該頭部,並重啓服務。性能
1
2
3
4
|
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
}
|
X-Frame-Options 頭部添加到HTTPS站點,確保不會嵌入到frame 或 iframe,避免點擊劫持,以確保網站的內容不會嵌入到其餘網站。網站
1
|
Header always set X-Frame-Options DENY
|
1
|
add_header X-Frame-Options "DENY";
|
1
2
3
4
|
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
setenv.add-response-header = ( "X-Frame-Options" => "DENY")
}
|