nginx URL重寫模塊(Rewrite)

官方文檔 http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

中文文檔 http://www.nginx.cn/doc/standard/httprewrite.html

翻譯比較詳細中文文檔 http://shouce.jb51.net/nginx/StandardHTTPModules/Rewrite.html

建議兩個文檔個都看看防止遺漏中文文檔不全
 

Rewrite模塊

用來執行URL重定向。這個機制有利於去掉惡意訪問的url,也有
利於搜索引擎優化(SEO)。
Nginx使用的語法源於Perl兼容正則表達式(PCRE)庫,基本語法如下:
^ :必須以^後的實體開頭
$ :必須以$前的實體結尾
. :匹配任意字符
[ ] :匹配指定字符集內的任意字符
[^ ] :匹配任何不包括在指定字符集內的任意字符串
| :匹配 | 之前或之後的實體
() :分組,組成一組用於匹配的實體,通常會有|來協助
n 捕獲子表達式,可以捕獲放在()之間的任何文本,比如:
^(.*)(hello|sir)$ 字符串爲“hi sir” 捕獲的結果: $1=hi $2=sir
這些被捕獲的數據,在後面就可以當變量一樣使用了

內部請求
外部請求是客戶端的url,內部請求是Nginx通過特殊的指令觸發。
比如:error_page、index、rewrite、try_files、include等等
內部請求分成兩種類型
1:內部重定向:URI被改變,可能會匹配到其他的Location
2:子請求:比如使用Addition模塊,指令add_after_body允許你在原始的URI之
後指定一個URI,會把該URI被處理後的結果,插入到原始的URI的body中。
內部重定向示例:
server {
    server_name sishuok.com;
        location /abc/ {
        rewrite ^/abc/(.*)$ /bcd/$1
    }
    location /bcd/{
        internal;
        root pages;
    }
}
條件結構的基本語法:
1:沒有操作符:指定的字符串或者變量不爲空,也不爲0開始的字符串,取true
2:= , != ,例:if($request_method = POST){…}
3:~,~*,!~,!~* ,例:if($uri ~* “\.jsp$”){…}
4:-f,!-f :用來測試指定文件是否存在,例:if(-f $request_filename){…}

正則表達式的一部分可以用圓括號,方便之後按照順序用$1-$9來引用。
示例配置:

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}
 
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}
 
if ($request_method = POST ) {
  return 405;
}
 
if (!-f $request_filename) {
  break;
  proxy_pass  http://127.0.0.1;
}
 
if ($slow) {
  limit_rate  10k;
}
 
if ($invalid_referer) {
  return   403;
}
 
if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
}

內置變量$invalid_referer用指令valid_referers指定。


5:-d,!-d :用來測試指定目錄是否存在
6:-e,!-e:用來測試指定文件、目錄或者符號鏈接是否存在
7:-x,!-x:用來測試指定文件是否存在和是否可以執行
8:break:跳出if塊

使用字段:server, location, if 
完成當前設置的規則,停止執行其他的重寫指令。

9:return:終止處理,並返回一個指定的http狀態碼

這個指令結束執行配置語句併爲客戶端返回狀態代碼,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416與500-504。此外,非標準代碼444將關閉連接並且不發送任何的頭部。
10:set:初始化或者重定義一個變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章