nginx配置http強制跳轉https


nginx配置http強制跳轉https

shu_ke
0.0232018.10.11 16:11:14字數 249閱讀 8,139

nginx配置http強制跳轉https

很多網站雖然支持 https, 但是直接在瀏覽器地址欄輸入網址后, 默認仍是以 http 協議去訪問的, http 強制跳轉 https 的需求應運而生, 以下介紹三種實現的方式

rewrite 方法

這是最常用的實現方法, 將所有 http 請求通過 rewrite 重定向到 https 即可

server { listen 80; server_name docs.lvrui.io rewrite ^(.*)$ https://$host$1 permanent; # return 302 https://$host$request_uri; } server { listen 443 ssl; server_name docs.lvrui.io; index index.html index.htm; access_log /var/log/nginx/docs.log main; ssl on; ssl_certificate /etc/ssl/docs.20150509.cn.crt; ssl_certificate_key /etc/ssl/docs.20150509.cn.key; error_page 404 /404.html; location / { root /var/www/html/docs; } } 

497 狀態碼
error code 497: normal request was sent to HTTPS

在一個站點只允許 https 訪問時, 如果使用 http 訪問會報出497錯誤碼

利用497狀態碼重定向到 https

server {
    listen 80;
    server_name docs.lvrui.io
    
    error_page 497  https://$host$uri?$args;
}

server {
    listen 443 ssl;
    server_name docs.lvrui.io;
    index index.html index.htm;
    access_log  /var/log/nginx/docs.log  main;
    ssl on;
    ssl_certificate /etc/ssl/docs.20150509.cn.crt;
    ssl_certificate_key  /etc/ssl/docs.20150509.cn.key;
    error_page 404 /404.html;
    location / {
        root /var/www/html/docs;
    }
}

index.html 刷新網頁

上面兩種方法均會耗費服務器資源, 我們使用 curl 來看下百度是如何實現的 baidu.com 向 www.baidu.com 的跳轉

$ curl baidu.com -vv 
* Rebuilt URL to: baidu.com/
*   Trying 220.181.57.217...
* TCP_NODELAY set
* Connected to baidu.com (220.181.57.217) port 80 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.51.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sat, 01 Apr 2017 06:32:35 GMT
< Server: Apache
< Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
< ETag: "51-47cf7e6ee8400"
< Accept-Ranges: bytes
< Content-Length: 81
< Cache-Control: max-age=86400
< Expires: Sun, 02 Apr 2017 06:32:35 GMT
< Connection: Keep-Alive
< Content-Type: text/html
< 
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
* Curl_http_done: called premature == 0
* Connection #0 to host baidu.com left intact

可以看到百度很巧妙的利用meta的刷新作用,將baidu.com跳轉到www.baidu.com
同理, 我們也可以用這個特性來實現http向https的跳轉

# index.html
<html> <meta http-equiv="refresh" content="0;url=https://docs.lvrui.io/"> </html> 
server { listen 80; server_name docs.lvrui.io; location / { # 將 index.html 文件放到下面的目錄下 root /var/www/html/refresh/; } } server { listen 443 ssl; server_name docs.lvrui.io; index index.html index.htm; access_log /var/log/nginx/docs.log main; ssl on; ssl_certificate /etc/ssl/docs.20150509.cn.crt; ssl_certificate_key /etc/ssl/docs.20150509.cn.key; error_page 404 /404.html; location / { root /var/www/html/docs; } } 

原文地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM