nginx地址重寫模塊

該ngx_http_rewrite_module模塊用於使用PCRE正則表達式更改請求URI,返回重定向,以及有條件地選擇配置。rewrite指令的功能就是,使用nginx提供的全局變量或本身設置的變量,而後結合正則表達式和標誌位實現url重寫以及重定向。
所以須要檢查pcre是否安裝 php

[root@]# rpm -q pcre
pcre-8.32-17.el7.x86_64

break

break語法

語法 break;
默認 -
應用位置 server,location,if

中止處理任何rewrite的相關指令。若是出如今location裏面,那麼全部後面的rewrite模塊指令都不會再執行,也不發起內部重定向,而是直接用新的URI進一步處理請求。html

例子

location = /testbreak {
        break;
        return 200 $request_uri;
        }

當uri中包含testbreak時,那麼會中止執行後面的rewrite模塊的命令,return屬於rewrite模塊。nginx

if

if語法

語法 if (condition) { ... }
默認 -
應用位置 server,location

if中的幾種判斷條件

  • 當變量的值爲空字符串或「 0」時,變量爲false ;在1.0.1版以前,任何以「 0」 開頭的字符串都被視爲false值。
  • 使用「 =」和「 !=」運算符比較變量和字符串;
  • 變量使用「 ~」(對於區分大小寫的匹配)和「 ~*」(對於不區分大小寫的匹配)運算符與正則表達式進行匹配。正則表達式能夠包含可供之後在$1.. $9變量中重用的捕獲。也可使用!取反。
  • 使用「 -f」和「 !-f」運算符檢查文件是否存在;
  • 使用「 -d」和「 !-d」運算符檢查目錄是否存在;
  • 使用「 -e」和「 !-e」運算符檢查文件,目錄或符號連接是否存在;
  • 使用「 -x」和「 !-x」運算符檢查可執行文件。

例子:

if ($request_method = POST ) {
  return 405;
}

if ( !-f $filename ) {
    break;            
}

return

中止處理併爲客戶端返回狀態碼,沒有狀態碼的URL將被視爲一個302狀態碼。
return語法正則表達式

語法 return code [text];return code URL;return URL;
默認 -
應用位置 server,location

例子:

# return code [text]; 
location = /1 {
    return 200 "this is 1";
}
# return code URL;
location = / {
    return 302 http://www.wanger.com;
}
# return URL;
location = / {
    return http://www.wanger.com;
}

rewrite

應用場景

  1. URL訪問跳轉,支持開發設計。 頁面跳轉、兼容性支持(新舊版本更迭)、展現效果(網址精簡)等。
  2. SEO優化(Nginx僞靜態的支持)
  3. 後臺維護、流量轉發等。
  4. 安全(動態界面進行假裝)。

rewrite語法

語法 rewrite regex replacement [flag];
默認 -
應用位置 server,location,if

例子:

rewrite ^(.*) http://wanger.com/$1 permanent;

若是()裏的正則表達式與請求的URI匹配,那麼URI將根據replacement字符串中的指定進行更改,匹配成功將跳轉到http://wanger.com/$1 ,$1的值是前面()裏的正則匹配到的值,然後面的permanent是永久重定向301的標誌,當rewrite 後面沒有任何 flag 時就順序執行 json

可選flag參數能夠是如下之一:

flag標記 說明
last 本條規則匹配完成後繼續匹配新的URI規則
break 本條規則匹配完成後不在進行新的URI匹配
redirect 302臨時重定向,瀏覽器會顯示跳轉後的URL地址,當nginx 服務關閉的時候,將沒法定向到特定的網站
permanent 301永久重定向,瀏覽器會顯示跳轉後的URL地址,除非客戶端清理瀏覽器緩存

last與break的區別

last 和 break同樣 它們都會終止此 location 中其餘它rewrite模塊指令的執行,last會從新將rewrite後的地址做爲一個新的URI在server塊中請求,而break會直接請求重寫後的地址,並不會再進行新的請求瀏覽器

舉個例子:

location ~ ^/break {
                rewrite ^/break /test/ break;
        }
location ~ ^/last {
                rewrite ^/last /test/ last;
        }
location /test/ {
                default_type application/json;
                return 200 '{"status":"success"}';
        }

當我請求127.0.0.1/break時,瀏覽器返回的是404,由於break不會去請求/test/塊,而網站根目錄下test目錄根本不存在,當我請求127.0.0.1/last時,瀏覽器返回的是{"status":"success"},由於last將地址重寫後生成了新的請求,新的請求地址爲/test/,而後與/test/塊進行匹配,返回200狀態碼以及{"status":"success"}緩存

set

用於定義一個變量,變量的值能夠包含文本,變量或者是它們的組合形式。安全

set語法

語法 set $variable value;
默認 -
應用位置 server,location,if

例子

location /wanger {
        #       return 302 http://60.205.177.168/huazai;
                root    html;
                index   index.html;
                set $var1 "client address is ";
                set $var2 $remote_addr;
                return 200 "$var1$var2";
}

效果以下:

curl 127.0.0.1/wanger
client address is 127.0.0.1

rewrite的一些實例

if ($host = "wanger.com"){
    rewrite ^/(.*)$ http://www.wanger.com/$1 permanent;
}
if (!-f $request_filename) {
    rewrite ^/(.*)  http://www.wanger.com/index.html;
}
if (!-e $request_filename) {
             rewrite ^/(.*)$ /index.php?$1 last;
    }

歡×××陳師傅」
nginx地址重寫模塊app

相關文章
相關標籤/搜索