nginx url重定向


nginx內部支持url rewrite,內部編譯進去了rewrite模塊,nginx的rewrite模塊類似於apache的rewriterule功能;支持多種規則和正則表達式;
詳細介紹如下:

Nginx Rewrite規則相關指令
Nginx Rewrite規則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。一個簡單的Nginx Rewrite規則語法如下:

rewrite ^/b/(.*).html /play.php?video=$1 break;

如果加上if語句,示例如下:

if (!-f $request_filename)

rewrite ^/img/(.*)$ /site/$host/images/$1 last;

指令

break

語法:break
默認值:none
使用字段:server, location, if
完成當前設置的規則,停止執行其他的重寫指令。
示例:

if ($slow) {
limit_rate 10k;
break;
}
if

語法:if (condition) { … }
默認值:none
使用字段:server, location
注意:在使用if指令之前請查看if is evil page並且盡量考慮用try_files代替。
判斷一個條件,如果條件成立,則后面的大括號內的語句將執行,相關配置從上級繼承。
可以在判斷語句中指定下列值:

一個變量的名稱;不成立的值為:空字符傳”“或者一些用“0”開始的字符串。
一個使用=或者!=運算符的比較語句。
使用符號*和模式匹配的正則表達式:
~為區分大小寫的匹配。
~不區分大小寫的匹配(firefox匹配FireFox)。
!和!
意為“不匹配的”。
使用-f和!-f檢查一個文件是否存在。
使用-d和!-d檢查一個目錄是否存在。
使用-e和!-e檢查一個文件,目錄或者軟鏈接是否存在。
使用-x和!-x檢查一個文件是否為可執行文件。
正則表達式的一部分可以用圓括號,方便之后按照順序用$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指定。

return

語法:return code
默認值:none
使用字段:server, location, if
這個指令結束執行配置語句並為客戶端返回狀態代碼,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416與500-504。此外,非標准代碼444將關閉連接並且不發送任何的頭部。

rewrite

語法:rewrite regex replacement flag
默認值:none
使用字段:server, location, if
按照相關的正則表達式與字符串修改URI,指令按照在配置文件中出現的順序執行。
可以在重寫指令后面添加標記。
如果替換的字符串以http://開頭,請求將被重定向,並且不再執行多余的rewrite指令。
尾部的標記(flag)可以是以下的值:

last - 完成重寫指令,之后搜索相應的URI或location。
break - 完成重寫指令。
redirect - 返回302臨時重定向,如果替換字段用http://開頭則被使用。
permanent - 返回301永久重定向。
注意如果一個重定向是相對的(沒有主機名部分),nginx將在重定向的過程中使用匹配server_name指令的“Host”頭或者server_name指令指定的第一個名稱,如果頭不匹配或不存在,如果沒有設置server_name,將使用本地主機名,如果你總是想讓nginx使用“Host”頭,可以在server_name使用“*”通配符(查看http核心模塊中的server_name)。例如:

rewrite ^(/download/.)/media/(.)..$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.
)/audio/(.)..$ $1/mp3/$2.ra last;
return 403;
但是如果我們將其放入一個名為/download/的location中,則需要將last標記改為break,否則nginx將執行10次循環並返回500錯誤。

location /download/ {
rewrite ^(/download/.)/media/(.)..$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.
)/audio/(.)..$ $1/mp3/$2.ra break;
return 403;
}
如果替換字段中包含參數,那么其余的請求參數將附加到后面,為了防止附加,可以在最后一個字符后面跟一個問號:

rewrite ^/users/(.*)$ /show?user=$1? last;
注意:大括號({和}),可以同時用在正則表達式和配置塊中,為了防止沖突,正則表達式使用大括號需要用雙引號(或者單引號)。例如要重寫以下的URL:

/photos/123456
為:

/path/to/photos/12/1234/123456.png
則使用以下正則表達式(注意引號):

rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;
如果指定一個“?”在重寫的結尾,Nginx將丟棄請求中的參數,即變量$args,當使用$request_uri或$uri&$args時可以在rewrite結尾使用“?”以避免nginx處理兩次參數串。
在rewrite中使用$request_uri將www.example.com重寫到example.com:

server {
server_name www.example.com;
rewrite ^ http://example.com$request_uri? permanent;
}
同樣,重寫只對路徑進行操作,而不是參數,如果要重寫一個帶參數的URL,可以使用以下代替:

if ($args ^~ post=100){
rewrite ^ http://example.com/new-address.html? permanent;
}
注意$args變量不會被編譯,與location過程中的URI不同(參考http核心模塊中的location)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM