摘抄了了張宴一本書上的URL重寫規則,算是複習一下吧;
nginx URL 重寫
1,ngin中的URL 重寫主要是使用perl的正則表達式,這也是爲什麼安裝Nginx的時候,要制定PCRE的原因。
2,Nginx Rewrite 規則相關指令
Nginx 重寫規則的主要指令是if ,rewrite,set,return break 等,而rewrite是最重要的指令,
例:
rewirte ^/b/(.*)\.html /play.php?video=$1 break;
可以這樣子理解上面的例子:
指令 匹配規則 動作
rewirte ^/b/(.*)\.html /play.php?video=$1 break; ;是Nginx 默認的結尾符號
上面的重寫規則 匹配開頭 /b/目錄下任何html 請求 重寫到對應的 /play.php?video=html名稱 break;
另外一個例子 IF
if (!-f $request_filename)
{
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
}
其中 $request_filename $host爲內置變量 $1 是前面()內的配置 後向引用
2.1 break 指令
語法 break
使用環境:server,location,if
該命令作用是完成當前規則集,不再處理後面的rewrite指令
例:
if ($slow) {
limit_rate 10k;
break;
}
2.2 if
語法 if (condition) {........}
使用環境 server,location
該指令用於檢查一個條件是否符合,如果條件符合,則執行大括號內的語句。if指令不支持嵌套
,不支持多個條件&&和||處理。
以下信息可以指定爲條件:
1,變量名,錯誤的值包括:空字符串“”,或者任何以0開始的字符串;
2,變量比較可以使用“=” != 運算符;
3,正則表達式模式匹配可以使用 ~*(不區分大小寫) ~ (區分大小寫)
4,!取反操作符,如 !~ !~*
5,-f !-f 判斷文件是否存在
6,-d !-d判斷文件或目錄是否存在
7,-x !-x來判斷文件是否可執行
放在()內的正則表達式 可以使用$1至$9 引用
例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($htto_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;
break;
}
if ($invalid_referer) {
return 403;
}
if ($args ^~ post=140) {
rewrite ^ http://example.com/permanent;
}
3 return
語法:return code
使用環境: server,location,if
location ~ .*\.(sh|bash)?$
{
return 403;
}
2.4 rewrite
語法 rewrit regex replancement flag
使用環境: server,location,if
該指令根據表達式來重定向URL或者修改字符串,指令根據配置文件中的順序來執行。
重寫表達式只對相對路徑有效,
其中flag 標記指的是last break redirect permanent
區別如下:
last 相當於apache裏面的[L] 標記,表示完成rewrite;
break 本條規則匹配完成後,終止匹配,不再匹配後面的規則;
redirect 返回302臨時重定向,瀏覽器地址欄會顯示跳轉後的URL地址
permanent 返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址
2.5set 指令
語法: set variable valus
使用環境: server,location,if
該指令用於定義一個變量,並給變量賦值,變量的值可以爲文本,變量及文本變量的聯合
實例如下:
set $varname 'hello'