Nginx實戰案例—Rewrite 規則
1. Rewrite規則
Rewrite規則可以實現對url的重寫,以及重定向
nginx官方文檔:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
作用場景:
- URL訪問跳轉,支持開發設計,如頁面跳轉,兼容性支持,展示效果等
- SEO優化
- 維護:後臺維護、流量轉發等
- 安全
2. 重定向
2.1 什麼是重定向
就是地址A跳轉到地址B。
重定向(Redirect)就是通過各種方法將各種網絡請求重新定個方向轉到其它位置(如:網頁重定向、域名的重定向、路由選擇的變化也是對數據報文經由路徑的一種重定向)
2.2 什麼時候需要重定向
- 網站調整(如改變網頁目錄結構)
- 網頁被移到一個新地址
- 網頁擴展名改變(如應用需要把
.php
改成.html
)
這種情況下,如果不做重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶得到一個404頁面錯誤信息,訪問流白白喪失;再者某些註冊了多個域名的網站,也需要通過重定向讓訪問這些域名的用戶自動跳轉到主站點等
3. 301和302
3.1 什麼是301和302
通過一個例子來了解它:
curl -I www.taobao.com
curl -I taobao.com
301 redirect: 301代表永久性轉移(Permanently Moved)
302 redirect: 302代表暫時性轉移(Temporarily Moved )
3.2 共同點和不同點
- 共同點:
301和302狀態碼都表示重定向,就是說瀏覽器在到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取(用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B) - 不同點:
301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了) ,搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向之後的網址;302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址
3.3 什麼時候進行301或者302跳轉
- 當一個網站或者網頁24/48小時內臨時移動到一個新的位置,這時候就要進行302跳轉。
打個比方說:我有一套房子,但是最近走親戚去親戚家住了,過兩天我還回來的 - 而使用301跳轉的場景就是之前的網站因爲某種原因需要移除掉,然後要到新的地址訪問,是永久性的。
就比如你的那套房子其實是租的,現在租期到了,你又在另一個地方找到了房子,之前租的房子不住了
3.4 使用301跳轉的場景
- 域名到期不想續費(或者發現了更適合網站的域名),想換個域名
- 在搜索引擎的搜索結果中出現了不帶www的域名,而帶www的域名卻沒有收錄,這個時候可以用301重定向來告訴搜索引擎我們目標的域名是哪個
- 空間服務器不穩定,換空間的時候
3.5 儘量使用301跳轉
舉個例子:
從網站A (網站比較爛)上做了一個302跳轉到網站B (搜索排名很靠前) ,這時候有時搜索引擎會使用網站B的內容,但卻收錄了網站A的地址。這樣在不知不覺間,網站B在爲網站A作貢獻,網站A的排名就靠前了
而302重定向很容易被搜索引擎誤認爲是利用多個域名指向同一網站,那麼你的網站就會被封掉,罪名是“利用重複的內容來干擾Google搜索結果的網站排名”
4. Rewrite 規則
rewrite <regex> <replacement> [flag];
關鍵字 正則 替代內容 flag標記
關鍵字:其中關鍵字不能改變
正則:perl兼容正則表達式語句進行規劃匹配
替代內容:將正則匹配的內容替換成replacement
flag標記:rewrite支持的flag標記
falg標記說明:
last #本條規則匹配完成後,繼續向下匹配新的location URL規則
break #本條規則匹配完成即終止,不再匹配後面的任何規則
redirect #返回302臨時重點向,瀏覽器地址會顯示跳轉後的URL地址
permanent #返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址
例子:
rewrite ^(.*)$ /pages/test.html break;
會把所有的請求都重定向到 /pages/test.html 頁面
5. www.westos.org—https://www.westos.org
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
124 server {
125 listen 80;
126 server_name www.westos.org;
127 rewrite ^/(.*)$ https://www.westos.org/$1; ##$1表示用戶在這裏輸入的內容保留,只會重定向$1前面的內容
128 #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; ##永久重定向(可以緩存,臨時的不允許緩存)
129 }
nginx -t #語法檢測
nginx -s reload #在不暫停服務的情況下重新加載
測試:
搜索www.westos.org 頁面跳轉到https://www.westos.org
搜索www.westos.org/test.html 跳轉到https://www.westos.org/test.html
注意:
1.404:雖然它下面沒有test.html這個文件,但是它仍然會重定向到https://www.westos.org/test.html
(即$1表示用戶在這裏輸入的內容保留,只會重定向$1前面的內容)
2.^/(.*)$
爲匹配所有,即匹配www.westos.org;
6. 訪問www.westos.org並且以bbs結尾的—https://bbs.westos.org
必須是以bbs結尾才能匹配到
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
106 server {
107 listen 443 ssl;
108 server_name www.westos.org bbs.westos.org;
119 #location / {
120 # root /web;
121 # index index.html index.htm;
122 #}
123 localtion / {
124 root /bbs;
125 index index.html index.htm;
126 }
127 }
128 server {
129 listen 80;
130 server_name www.westos.org;
131 #rewrite ^/(.*)$ https://www.westos.org/$1; ##$1表示用戶在這裏輸入的內容保留,只會重定向$1前面的內容
132 #rewrite ^/(.*)$ https://www.westos.org/$1 permanent; ##永久重定向(可以緩存,臨時的不允許緩存)
133 rewrite ^/bbs$ https://bbs.westos.org/index.html permanent; ##表示訪問www.westos.org並且以bbs結尾的,都定向到https://bbs.westos.org
134 }
cd /usr/local/nginx/conf/
mkdir /bbs
vim /bbs/index.html
cat /bbs/index.html
nginx -t #語法檢測
nginx -s reload #在不暫停服務的情況下重新加載
在真機中添加解析:
vim /etc/hosts
測試:
bbs.westos.org #查看到的是server1,這是因爲我們在配置文件中寫好的默認發佈頁面內容爲server1
https://bbs.westos.org/ #添加證書後,查看到/bbs裏的默認發佈內容
www.westos.org/bbs #頁面會自動跳轉到https://bbs.westos.org/