nginx rewrite重寫規則集合


本文根據網絡搜索整理,不是原創

一.正則表達式匹配,其中:
~       為區分大小寫匹配
~*      為不區分大小寫匹配
!~和!~*  分別為區分大小寫不匹配及不區分大小寫不匹配

.      匹配除換行符以外的任意字符
\w     匹配字母或數字或下划線或漢字
\s     匹配任意的空白符
\d     匹配數字
\b     匹配單詞的開始或結束
^      匹配字符串的開始
$      匹配字符串的結束

*         重復零次或更多次
+         重復一次或更多次
?         重復零次或一次
{n}       重復n次
{n,}      重復n次或更多次
{n,m}     重復n到m次
*?        復任意次,但盡可能少重復
+?        重復1次或更多次,但盡可能少重復
??        重復0次或1次,但盡可能少重復
{n,m}?    重復n到m次,但盡可能少重復
{n,}?     重復n次以上,但盡可能少重復

\W        匹配任意不是字母,數字,下划線,漢字的字符
\S        匹配任意不是空白符的字符
\D        匹配任意非數字的字符
\B        匹配不是單詞開頭或結束的位置
[^x]      匹配除了x以外的任意字符
[^aeiou]  匹配除了aeiou這幾個字母以外的任意字符    

(exp)         匹配exp,並捕獲文本到自動命名的組里
(?<name>exp)  匹配exp,並捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp)       匹配exp,不捕獲匹配的文本,也不給此分組分配組號    
(?=exp)       匹配exp前面的位置
(?<=exp)      匹配exp后面的位置
(?!exp)       匹配后面跟的不是exp的位置
(?<!exp)      匹配前面不是exp的位置
(?#comment)   注釋分組不對正則表達式的處理產生任何影響

二.文件及目錄匹配,其中:
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行

三.rewrite指令的最后一項參數為flag標記,flag標記有:
1.last    相當於apache里面的[L]標記,表示rewrite。
2.break本條規則匹配完成后,終止匹配,不再匹配后面的規則。
3.redirect  返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址。
4.permanent  返回301永久重定向,瀏覽器地址會顯示跳轉后的URL地址。

四. 語法規則: 【= | ^~ | ~ | ~* | / | /uri 】
 location = /uri                = 表示精確匹配,只有完全匹配上才能生效,若找到,停止搜索; 
 location ^~ /uri               ^~開頭表示對URL路徑進行前綴匹配,並且在正則匹配之前,若找到,停止搜索; 
 location ~ pattern             ~開頭表示區分大小寫的正則匹配,按配置文件順序匹配; 
 location ~* pattern            ~*開頭表示不區分大小寫的正則匹配,按配置文件順序匹配; 
 location /uri                  不帶任何修飾符,表示前綴匹配,在正則匹配之后; 
 location /                     通用匹配,任何未匹配到其他location的請求都會匹配到,相當於default; 

五. 多個location配置的情況匹配順序為
首先精確匹配 = ;
其次前綴匹配 ^~;
其次是按照配置文件中的正則匹配; 
然后匹配不帶任何修飾符的前綴匹配; 
最后交給/通用匹配;

 nginx全局變量

arg_PARAMETER        #這個變量包含GET請求中,如果有變量PARAMETER時的值。
args                 #這個變量等於請求行中(GET請求)的參數,如:foo=123&bar=blahblah;
binary_remote_addr   #二進制的客戶地址。
body_bytes_sent      #響應時送出的body字節數數量。即使連接中斷,這個數據也是精確的。
content_length       #請求頭中的Content-length字段。
content_type         #請求頭中的Content-Type字段。
cookie_COOKIE        #cookie COOKIE變量的值
document_root        #當前請求在root指令中指定的值。
document_uri         #與uri相同。
host                 #請求主機頭字段,否則為服務器名稱。
hostname             #Set to themachine’s hostname as returned by gethostname
http_HEADER
is_args              #如果有args參數,這個變量等於”?”,否則等於”",空值。
http_user_agent      #客戶端agent信息
http_cookie          #客戶端cookie信息
limit_rate           #這個變量可以限制連接速率。
query_string         #與args相同。
request_body_file    #客戶端請求主體信息的臨時文件名。
request_method       #客戶端請求的動作,通常為GET或POST。
remote_addr          #客戶端的IP地址。
remote_port          #客戶端的端口。
remote_user          #已經經過Auth Basic Module驗證的用戶名。
request_completion   #如果請求結束,設置為OK. 當請求未結束或如果該請求不是請求鏈串的最后一個時,為空(Empty)。
request_method       #GET或POST
request_filename     #當前請求的文件路徑,由root或alias指令與URI請求生成。
request_uri          #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。不能修改。
scheme               #HTTP方法(如http,https)。
server_protocol      #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
server_addr          #服務器地址,在完成一次系統調用后可以確定這個值。
server_name          #服務器名稱。
server_port          #請求到達服務器的端口號。

nginx中rewrite 一些簡單重寫

禁止.mp3.sh訪問
location ~ .*\.(mp3|sh)$
{
return 403;
}

目錄/hometest/ 重定向到 /www/temp/
rewrite ^/([0-9a-z]+)test/$ /www/$1 permanent;
例如:
訪問 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;

根據表達式來重定向URI及修改字符串,只對相對路徑有效;如果想配對主機名,需使用if語句,示例如下:
if( $host ~* www\.(.*)\.(.*)$)
{
set $test1 $1;
set $test2 $2;
rewrite ^(.*)$ http://t=$test1&m=$test2 permanent;
}

例子:訪問www.baidu.com
結果:瀏覽器會訪問 http://baiducom/ ($1代表第1個括號內容$2代表第2括號內容)

 

 


免責聲明!

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



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