nginx rewrite

qq_50263172發表於2020-10-17
Rewrite 相關指令
  • Nginx Rewrite 相關指令有 if、rewrite、set、return

if 語句

  • 應用環境

    server,location
    

    語法:

    if (condition) {}
    if 可以支援如下條件判斷匹配符號
    ~ 					正則匹配 (區分大小寫)
    ~* 				    正則匹配 (不區分大小寫)
    !~                  正則不匹配 (區分大小寫)
    !~*		            正則不匹配  (不區分大小寫)
    -f 和!-f 		    用來判斷是否存在檔案
    -d 和!-d 		    用來判斷是否存在目錄
    -e 和!-e 		    用來判斷是否存在檔案或目錄
    -x 和!-x 		    用來判斷檔案是否可執行
    
    在匹配過程中可以引用一些Nginx的全域性變數
    $args				請求中的引數;
    $document_root	    針對當前請求的根路徑設定值;
    $host				請求資訊中的"Host",如果請求中沒有Host行,則等於設定的伺服器名;
    $limit_rate			對連線速率的限制;
    $request_method		請求的方法,比如"GET""POST";
    $remote_addr		客戶端地址;
    $remote_port		客戶端埠號;
    $remote_user		客戶端使用者名稱,認證用;
    $request_filename   當前請求的檔案路徑名(帶網站的主目錄/usr/local/nginx/html/images /a.jpg)
    $request_uri		當前請求的檔案路徑名(不帶網站的主目錄/images/a.jpg)
    $query_string$args相同;
    $scheme				用的協議,比如http或者是https
    $server_protocol	請求的協議版本,"HTTP/1.0""HTTP/1.1";
    $server_addr 		伺服器地址,如果沒有用listen指明伺服器地址,使用這個變數將發起一次系統呼叫以取得地址(造成資源浪費);
    $server_name		請求到達的伺服器名;
    $document_uri$uri一樣,URI地址;
    $server_port 		請求到達的伺服器埠號;
    
    Rewrite flag

    rewrite 指令根據表示式來重定向URI,或者修改字串。可以應用於server,location, if環境下每行rewrite指令最後跟一個flag標記,支援的flag標記有:

    last 			    相當於Apache裡的[L]標記,表示完成rewrite。預設為last。
    break 				本條規則匹配完成後,終止匹配,不再匹配後面的規則
    redirect 			返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
    permanent 		    返回301永久重定向,瀏覽器地址會顯示跳轉後URL地址
    

    redirect 和 permanent區別則是返回的不同方式的重定向,對於客戶端來說一般狀態下是沒有區別的。而對於搜尋引擎,相對來說301的重定向更加友好,如果我們把一個地址採用301跳轉方式跳轉的話,搜尋引擎會把老地址的相關資訊帶到新地址,同時在搜尋引擎索引庫中徹底廢棄掉原先的老地址。使用302重定向時,搜尋引擎(特別是google)有時會檢視跳轉前後哪個網址更直觀,然後決定顯示哪個,如果它覺的跳轉前的URL更好的話,也許位址列不會更改,那麼很有可能出現URL劫持的現像。在做URI重寫時,有時會發現URI中含有相關引數,如果需要將這些引數儲存下來,並且在重寫過程中重新引用,可以用到 () 和 $N 的方式來解決。

2.3、Rewrite匹配參考示例

本地解析host檔案
# http://www.testpm.com/a/1.html ==> http://www.testpm.com/b/2.html
    location /a {
        root    /html;
        index   1.html index.htm;
        rewrite .* /b/2.html permanent;
        }
    location /b {
        root    /html;
        index   2.html index.htm;
        }
例2:
# http://www.testpm.com/2019/a/1.html ==> http://www.testpm.com/2018/a/1.html
     location /2019/a {
        root    /var/www/html;
        index   1.html index.hml;
        rewrite ^/2019/(.*)$ /2018/$1 permanent;
        }
     location /2018/a {
        root    /var/www/html;
        index   1.html index.htl;
        }

例3:
# http://www.qf.com/a/1.html ==> http://jd.com
location /a {
        root    /html;
        if ($host ~* testpm.com ) {
        rewrite .* http://jd.com permanent;
        }
        }

例4:
# http://www.qf.com/a/1.html ==> http://jd.com/a/1.html
location /a {
        root /html;
        if ( $host ~* testpm.com ){
        rewrite .* http://jd.com$request_uri permanent;
        }
        }

例5: 在訪問目錄後新增/  (如果目錄後已有/,則不加/)
# http://www.tianyun.com/a/b/c
# $1: /a/b
# $2: c
# http://$host$1$2/
location /a/b/c {
        root    /usr/share/nginx/html;
        index   index.html index.hml;
        if (-d $request_filename) {
        rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;
        }
        }

例6:
# http://www.tianyun.com/login/tianyun.html ==>  http://www.tianyun.com/reg/login.html?user=tianyun
	location /login {
        root   /usr/share/nginx/html;
        rewrite ^/login/(.*)\.html$ http://$host/reg/login.html?user=$1;
        }
    location /reg {
        root /usr/share/nginx/html;
        index login.html;

        }

例7:
#http://www.tianyun.com/qf/11-22-33/1.html  ==>  http://www.tianyun.com/qf/11/22/33/1.html
location /qf {
            rewrite ^/qf/([0-9]+)-([0-9]+)-([0-9]+)(.*)$ /qf/$1/$2/$3$4 permanent;
        }

        location /qf/11/22/33 {
                root /html;
                index   1.html;
        }

相關文章