Nginx URL重寫(rewrite)

一.Url重寫的概念

URL 重寫是攔截客戶端傳入 Web 請求URL並自動將其定向到到規則指定的 URL 的過程。好比瀏覽器發來請求 http://www.bawei.com/hello.html ,服務器自動將這個請求中定向爲http://www.bawei.com/index.php?method=hello
Url重寫的目的是主要是利於seo,靜態頁面的方式,比較容易被搜索引擎給蒐集javascript

二. 重寫常規步驟

1.把網頁上帶連接的地方,都換上新的靜態化連接。搜索引擎和瀏覽器將經過該連接來發生請求。(有些人作修改不是在網頁上,而是進行動態連接向靜態連接的轉向,這是嚴重錯誤的)
2.在nginx配置文件中添加rewrite重寫規則。php

三. 核心知識點

(一) rewrite語法格式及參數語法說明以下:

    rewrite    <regex>    <replacement>    [flag];
    關鍵字      正則        替代內容          flag標記
 
    關鍵字:其中關鍵字error_log不能改變
     正則:perl兼容正則表達式語句進行規則匹配
     替代內容:將正則匹配的內容替換成replacement
    flag標記:rewrite支持的flag標記
 
flag標記說明:
last  #本條規則匹配完成後,繼續向下匹配新的location URI規則
break  #本條規則匹配完成即終止,再也不匹配後面的任何規則
redirect  #返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent  #返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址css

(二)rewrite參數的標籤段位置:

server,location,ifhtml

(三)例子:

rewrite ^/(.*) http://www.bawei.com/$1 permanent;
說明:                                        
rewrite爲固定關鍵字,表示開始進行rewrite匹配規則
regex部分是 ^/(.*) ,這是一個正則表達式,匹配完整的域名和後面的路徑地址
replacement部分是http://www.bawei.com/$1 $1,是取自regex部分()裏的內容。匹配成功後跳轉到的URL。
flag部分 permanent表示永久301重定向標記,即跳轉到新的 http://www.bawei.com/$1 地址上java

(四)regex 經常使用正則表達式說明

字符 描述
</td> 將後面接着字符標記爲一個特殊字符或一個原義字符或一個向後引用。如「n」匹配一個換行符,而「$」則匹配「$」
^ 匹配輸入字符串的起始位置
$ 匹配輸入字符串結束位置
* 匹配前面的字符零次或屢次。如「ol*」能匹配「o」及「ol」、「oll」
+ 匹配前面的字符一次或屢次。如「ol+」能匹配「ol」及「oll」、「oll」,但不能匹配「o」
? 匹配前面的字符零次或一次,例如「do(es)?」能匹配「do」或者「does」,"?"等效於"{0,1}"
. 匹配除「n」以外的任何單個字符,若要匹配包括「n」在內的任意字符,請使用諸如「[.n]」之類的模式。
(pattern) 匹配括號內pattern並能夠在後面獲取對應的匹配,經常使用$0...$9屬性獲取小括號中的匹配內容,要匹配圓括號字符須要(Content)

(五)rewrite 企業應用場景

Nginx的rewrite功能在企業裏應用很是普遍:
 能夠調整用戶瀏覽的URL,看起來更規範,合乎開發及產品人員的需求。
爲了讓搜索引擎搜錄網站內容及用戶體驗更好,企業會將動態URL地址假裝成靜態地址提供服務。
網址換新域名後,讓舊的訪問跳轉到新的域名上。例如,訪問京東的360buy.com會跳轉到jd.com
根據特殊變量、目錄、客戶端的信息進行URL調整等jquery

(六)Nginx配置rewrite過程介紹

(1)建立rewrite語句nginx

vi conf/vhost/www.abc.com.conf
#vi編輯虛擬主機配置文件web

文件內容
server {
        listen 80;
        server_name abc.com;
        rewrite ^/(.*) http://www.abc.com/$1 permanent;
}
 
 
server {
        listen 80;
        server_name www.abc.com;
        location / {
                root /data/www/www;
                index index.html index.htm;
        }
        error_log    logs/error_www.abc.com.log error;
        access_log    logs/access_www.abc.com.log    main;
}
或者
server {
        listen 80;
        server_name abc.com www.abc.com;
        if ( $host != 'www.abc.com'  ) {
                rewrite ^/(.*) http://www.abc.com/$1 permanent;
        }
        location / {
                root /data/www/www;
                index index.html index.htm;
        }
        error_log    logs/error_www.abc.com.log error;
        access_log    logs/access_www.abc.com.log    main;
}
(2)重啓服務
確認無誤即可重啓nginx,操做以下:ajax

nginx -t
#結果顯示ok和success沒問題即可重啓
service nginx restart正則表達式

(3)查看跳轉效果
打開瀏覽器訪問abc.com
頁面打開後,URL地址欄的abc.com變成了www.bawei.com說明URL重寫成功。

四.完整示例

1 重定向!
a.html頁面內容爲「This is AAA!!!」
b.html頁面內容爲「This is BBB!!!」
原地址

rewrite配置後

  location / {
        root   html;
        index  index.php index.html index.htm;
    #rewrite /show/(\d+).html$ /show.php?id=$1 last;
      rewrite /show/(\d+)/(.*).html$ /show.php?id=$1&name=$2 last;
    #臨時重定向和永久重定向
     # rewrite /a.html /b.html redirect;
      rewrite /a.html /b.html permanent;
}

2 僞靜態

 

Rewrite配置後

1 location / {
2     root   /usr/share/nginx/html/bawei;
3     index  index.php index.html index.htm;
4     rewrite /list/([0-9]+).html$ /list.php?id=$1 last;
5 }

3 防盜鏈
容許www.bawei.com此域名正常訪問,www.baba.com不容許訪問圖片資源

Rewrite配置防盜鏈後使用www.baba.com域名訪問

 1 server {
 2 
 3 listen       80;
 4 server_name  www.bawei.com www.baba.com;
 5 
 6 #charset koi8-r;
 7 #access_log  /var/log/nginx/host.access.log  main;
 8 
 9 location ~* \.(gif|jpg|png|jpeg)$ {
10     expires     30d;
11 }

#配置白名單 

valid_referers *.bawei.com www.bawei.com;  

#若是不在白名單內則返回1

1     if ($invalid_referer) {
2             rewrite ^/ https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2130925602,2536254888&fm=27&gp=0.jpg;
3             #return 404;
4     }
5 }

4 動靜分離
Nginx動靜分離實現:
Nginx是一種輕量級,高性能,多進程的Web服務器,很是適合做爲靜態資源的服務器使用,而動態的訪問操做可使用穩定的Apache、Tomcat及IIS等來實現,這裏就以Nginx做爲代理服務器的同時,也使用其做爲靜態資源的服務器,而動態的訪問服務器就以Apache爲例說明。

1、原理

原理:

說明:
一、代理服務器和靜態服務器即爲一臺服務器上,這裏只是爲了明顯區分動靜分離所處服務器的不一樣;
二、靜態服務器中,存放的資源主要是源代碼文件、圖片、屬性、樣式以及其它全部非動態的資源文件;
三、調度規則,即爲代理服務器,這裏是Nginx的服務器調度規則;
四、動態服務器,其種類比較繁多,能夠是Apache、Tomcat、IIS以及其它Web服務器,它們通常分別隸屬於一臺服務器;
 

2、實現

一、實現說明
如上圖所示,當客戶端訪問代理服務器時:
首先,加載和顯示存放在靜態服務器中的靜態資源,這裏以html爲例;
其次,若是上一步沒有匹配對應的資源,咱們就認爲是動態訪問請求,那麼就直接訪問參與負載均衡的服務器列表中的某一臺服務器的動態操做;
最後,Nginx做爲Web服務器加載靜態資源(html、css、js、image),而靜態資源若是須要動態獲取數據,並填充到頁面顯示,會自動去往負載服務器獲取並返回,在實現了動態分離的同時,也參與了服務器的負載均衡。
 
二、準備工做
準備兩臺計算機設備,分別爲:
靜態服務器:169.254.195.161
動態服務器:169.254.28.29
 
三、安裝配置
首先,在靜態服務器中安裝Nginx服務器,在動態服務器中安裝Apache服務器,具體安裝過程當中這裏省略;
其次,分別配置Nginx和Apache,配置以下:

 1 nginx.conf:
 2 http {
 3     #load balancing servers
 4     upstream webservers {
 5       ip_hash;
 6       server 169.254.28.29max_fails=2 fail_timeout=2;
 7    }
 8  
 9    server {
10       listen       80;
11       server_name  localhost;
12      
13       access_log/usr/local/nginx/logs/access.log;
14       error_log/usr/local/nginx/logs/error.log;
15      
16       #limitbuffer size and overflows
17       client_body_buffer_size16k;
18       client_header_buffer_size1k;
19       client_max_body_size1m;
20  
21       #default char set
22       charset utf-8;
23      
24       #默認靜態資源
25       location / {
26           root    /project/cwteam;
27           index  index.html index.htm   
28       
29           allow all;
30       }
31       #動態資源加載
32       location ~.(php|jsp)?$ {
33           proxy_pass http://webservers;
34       }
35   }
36 }

httpd.conf:
這裏只羅列Apache根目錄的配置路徑,以下:

1 DocumentRoot 「D:/project/cwteam」
2 <Directory 「D:/project/cwteam」>
3 Options IndexesFollowSymLinks Includes ExecCGI
4 AllowOverride All
5 Require all granted
6 </Directory>

最後,啓動Nginx和Apache服務,並驗證是否成功啓動。

3、驗證

首先,在靜態服務器中的Web根目錄下,放置一個static.html文件,內容以下:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <script src="../Public/htmls/js/jquery-1.8.3.min.js"></script>
 6 </head>
 7 <body style="background-color: #9999;">
 8       <div id="ajaxDync"></div>
 9 </body>
10  
11 <script type="text/javascript">
12 $(document).ready(function() {
13       $.ajax({  
14             url:'./dynamic.php?action=ok',  
15             type:'get',  
16             cache : false,
17           success:function(data){  
18               $("#ajaxDync").html(data);  
19           }
20       });
21 });
22 </script>
23 </html>

其次,在動態服務器中的Web服務器目錄下放在一個動態腳本dynamic.php,內容以下:

 1 <?php
 2 if($_GET['action']=='ok'){
 3       echo 'Hello World!'.'---IP:169.254.28.29';
 4 }
 5 ?>
 6  
 7 NOTE:
 8 一、爲了區分動靜服務器內的服務器腳本,咱們在靜態服務器中的dynamic.php內容:
 9 <?php
10 if($_GET['action']=='ok'){
11       echo 'Hello World!'.'---IP:169.254.195.161';
12 }
13 ?>

而在動態服務器中的dynamic.php內容以下:

1 <?php
2 if($_GET['action']=='ok'){
3       echo 'Hello World!'.'---IP:169.254.28.29';
4 }
5 ?>

二、須要保證動靜服務器擁有一樣的代碼項目,通常使用rsync同步軟件同步不一樣服務器中的項目資源文件,關於rsync會在後續總結介紹使用。
 
最後,打開瀏覽器輸入192.168.1.100,結果以下:

從上圖,咱們知道動靜已經分離成功了,由於靜態資源頁面html加載的是靜態服務器的,而動態請求操做則訪問的是動態服務器。

相關文章
相關標籤/搜索