nginx rewrite重寫(xiě)規則集合
本文根據網(wǎng)絡(luò )搜索整理,不是原創(chuàng )
一.正則表達式匹配,其中: ~ 為區分大小寫(xiě)匹配 ~* 為不區分大小寫(xiě)匹配 !~和!~* 分別為區分大小寫(xiě)不匹配及不區分大小寫(xiě)不匹配 . 匹配除換行符以外的任意字符 \w 匹配字母或數字或下劃線(xiàn)或漢字 \s 匹配任意的空白符 \d 匹配數字 \b 匹配單詞的開(kāi)始或結束 ^ 匹配字符串的開(kāi)始 $ 匹配字符串的結束 * 重復零次或更多次 + 重復一次或更多次 ? 重復零次或一次 {n} 重復n次 {n,} 重復n次或更多次 {n,m} 重復n到m次 *? 復任意次,但盡可能少重復 +? 重復1次或更多次,但盡可能少重復 ?? 重復0次或1次,但盡可能少重復 {n,m}? 重復n到m次,但盡可能少重復 {n,}? 重復n次以上,但盡可能少重復 \W 匹配任意不是字母,數字,下劃線(xiàn),漢字的字符 \S 匹配任意不是空白符的字符 \D 匹配任意非數字的字符 \B 匹配不是單詞開(kāi)頭或結束的位置 [^x] 匹配除了x以外的任意字符 [^aeiou] 匹配除了aeiou這幾個(gè)字母以外的任意字符 (exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里 (?<name>exp) 匹配exp,并捕獲文本到名稱(chēng)為name的組里,也可以寫(xiě)成(?'name'exp) (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 (?=exp) 匹配exp前面的位置 (?<=exp) 匹配exp后面的位置 (?!exp) 匹配后面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置 (?#comment) 注釋分組不對正則表達式的處理產(chǎn)生任何影響 二.文件及目錄匹配,其中: -f和!-f用來(lái)判斷是否存在文件 -d和!-d用來(lái)判斷是否存在目錄 -e和!-e用來(lái)判斷是否存在文件或目錄 -x和!-x用來(lái)判斷文件是否可執行 三.rewrite指令的最后一項參數為flag標記,flag標記有: 1.last 相當于apache里面的[L]標記,表示rewrite。 2.break本條規則匹配完成后,終止匹配,不再匹配后面的規則。 3.redirect 返回302臨時(shí)重定向,瀏覽器地址會(huì )顯示跳轉后的URL地址。 4.permanent 返回301永久重定向,瀏覽器地址會(huì )顯示跳轉后的URL地址。 四. 語(yǔ)法規則: 【= | ^~ | ~ | ~* | / | /uri 】 location = /uri = 表示精確匹配,只有完全匹配上才能生效,若找到,停止搜索; location ^~ /uri ^~開(kāi)頭表示對URL路徑進(jìn)行前綴匹配,并且在正則匹配之前,若找到,停止搜索; location ~ pattern ~開(kāi)頭表示區分大小寫(xiě)的正則匹配,按配置文件順序匹配; location ~* pattern ~*開(kāi)頭表示不區分大小寫(xiě)的正則匹配,按配置文件順序匹配; location /uri 不帶任何修飾符,表示前綴匹配,在正則匹配之后; location / 通用匹配,任何未匹配到其他location的請求都會(huì )匹配到,相當于default; 五. 多個(gè)location配置的情況匹配順序為 首先精確匹配 = ; 其次前綴匹配 ^~; 其次是按照配置文件中的正則匹配; 然后匹配不帶任何修飾符的前綴匹配; 最后交給/通用匹配;
nginx全局變量
arg_PARAMETER #這個(gè)變量包含GET請求中,如果有變量PARAMETER時(shí)的值。 args #這個(gè)變量等于請求行中(GET請求)的參數,如:foo=123&bar=blahblah; binary_remote_addr #二進(jìn)制的客戶(hù)地址。 body_bytes_sent #響應時(shí)送出的body字節數數量。即使連接中斷,這個(gè)數據也是精確的。 content_length #請求頭中的Content-length字段。 content_type #請求頭中的Content-Type字段。 cookie_COOKIE #cookie COOKIE變量的值 document_root #當前請求在root指令中指定的值。 document_uri #與uri相同。 host #請求主機頭字段,否則為服務(wù)器名稱(chēng)。 hostname #Set to themachine’s hostname as returned by gethostname http_HEADER is_args #如果有args參數,這個(gè)變量等于”?”,否則等于”",空值。 http_user_agent #客戶(hù)端agent信息 http_cookie #客戶(hù)端cookie信息 limit_rate #這個(gè)變量可以限制連接速率。 query_string #與args相同。 request_body_file #客戶(hù)端請求主體信息的臨時(shí)文件名。 request_method #客戶(hù)端請求的動(dòng)作,通常為GET或POST。 remote_addr #客戶(hù)端的IP地址。 remote_port #客戶(hù)端的端口。 remote_user #已經(jīng)經(jīng)過(guò)Auth Basic Module驗證的用戶(hù)名。 request_completion #如果請求結束,設置為OK. 當請求未結束或如果該請求不是請求鏈串的最后一個(gè)時(shí),為空(Empty)。 request_method #GET或POST request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。 request_uri #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。不能修改。 scheme #HTTP方法(如http,https)。 server_protocol #請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。 server_addr #服務(wù)器地址,在完成一次系統調用后可以確定這個(gè)值。 server_name #服務(wù)器名稱(chēng)。 server_port #請求到達服務(wù)器的端口號。
nginx中rewrite 一些簡(jiǎn)單重寫(xiě)
禁止.mp3.sh訪(fǎng)問(wèn)
location ~ .*\.(mp3|sh)$
{
return 403;
}
目錄/hometest/ 重定向到 /www/temp/
rewrite ^/([0-9a-z]+)test/$ /www/$1 permanent;
例如:
訪(fǎng)問(wèn) ceshitest.com/uuu/
結果重定向到 ceshitest.com/www/uuu/
文件/ceshi-123-456-789.html 重定向到 /ceshi/123/456/789.html
rewrite ^/ceshi-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /ceshi/$1/$2/ceshitest_$3.html permanent;
根據表達式來(lái)重定向URI及修改字符串,只對相對路徑有效;如果想配對主機名,需使用if語(yǔ)句,示例如下:
if( $host ~* www\.(.*)\.(.*)$)
{
set $test1 $1;
set $test2 $2;
rewrite ^(.*)$ http://t=$test1&m=$test2 permanent;
}
例子:訪(fǎng)問(wèn)www.baidu.com
結果:瀏覽器會(huì )訪(fǎng)問(wèn) http://baiducom/ ($1代表第1個(gè)括號內容$2代表第2括號內容)