Nginx重寫


一、location匹配

1.分類:
(1)正則location:~,~*
(2)普通location:=,^~,@,無
2.匹配規則:
(1) =    精確匹配。如果找到,停止搜索
(2) ^~    普通匹配,匹配路徑的前綴,如果找到,停止搜索,不繼續匹配正則
(3) ~    正則匹配,區分大小寫
(4) ~*    正則匹配,不區分大小寫
(5) !~    正則不匹配,不區分大小寫
(6) !~* 正則不匹配,區分大小寫
(7) /      通用匹配,任何請求都會匹配到
(8) @     命名location,內部重定向
3.匹配順序:
(1)進行精確匹配(=),如果匹配上,停止搜索。否則繼續下一步;
(2)進行普通匹配,如果找到完整匹配路徑停止搜索。否則繼續下一步;
(3)匹配最大前綴,如果它帶有^~,停止搜索,否則記錄這個最大前綴匹配,繼續下一步;
(4)進行正則匹配(~和~*),按順序逐個匹配,如果匹配上,停止搜索,否則使用上一步記錄的最大前綴匹配。
4.優先級:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 最大前綴匹配路徑) > (/)

二、目錄/文件判斷

1.-f和!-f用來判斷是否存在文件
2.-d和!-d用來判斷是否存在目錄
3.-e和!-e用來判斷是否存在文件或目錄
4.-x和!-x用來判斷文件是否可執行

三、指令

1.location 指令
語法:location [=|~|~*|^~|@] URI {}
作用域:server
為匹配的URI進行配置,URI可以是字符串或正則表達式
示例:

location ~ .*\.(gif|jpg|jpeg|png)$
{
    expires 30d;
}

2.if 指令
語法:if (){}
作用域:server,location
檢查一個條件是否符合,如果條件符合,則執行大括號內的語句。不支持嵌套和多個條件&&或||處理
示例:

if ( !-e $request_filename )
{
    rewrite  ^/(.*)$ index.php last;
}

3.try_files 指令
語法:try_files file1 [file2 ... filen] URI 或 try_files file1 [file2 ... filen] =code
作用域:server location
按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示為文件夾),如果所有的文件或文件夾都找不到,會進行一個內部重定向到最后一個參數。注意,只有最后一個參數可以引起一個內部重定向,之前的參數只設置內部URI的指向。最后一個參數是回退URI且必須存在,否則會出現內部500錯誤。命名的location也可以使用在最后一個參數中。與rewrite指令不同,如果回退URI不是命名的location那么$args不會自動保留,如果你想保留$args,則必須明確聲明
示例:

try_files $uri $uri/ /index.php?$args;
try_files $uri =404;

4.set 指令
語法:set variable value;
作用域:server,location,if
定義一個變量,並給變量賦值。變量的值可以為文本、變量以及文本變量的聯合
示例:

set $a "hello world";

5.break 指令
語法:break;
作用域:server,location,if
完成當前的規則集,不再處理rewrite指令
示例:

location ~ ^/(cron|templates)/
{
    deny all;
    break;
}

6.return 指令
語法:return code;
作用域:server,location,if
結束執行並返回狀態碼給客戶端。
示例:如果訪問的URI以".sh"或".bash"結尾,則返回403狀態碼

location ~ .*\.(sh|flv|mp3)$
{
    return 403;
}

7.rewrite 指令
語法:rewrite regex replacement flag;
作用域:server,location,if
根據表達式來重定向URI,或者修改字符串。指令根據配置文件中的順序來執行。注意,重寫表達式只對相對路徑有效
示例:

if( $host ~* www\.(.*) )
{
    set $domain $1;
    rewrite ^(.*)$  http://$domain$1 permanent;
}

rewrite的flag標記:
last             將rewrite后的地址重新在server標簽執行,地址欄url不變。超過10次匹配不到報500錯誤。使用alias指令必須用last標記
break          直接使用當前資源,不再執行location里余下的語句,完成本次請求,地址欄url不變
redirect       返回302臨時重定向,地址欄顯示重定向后的url,爬蟲不會更新url
permanent  返回301永久重定向,地址欄顯示重定向后的url,爬蟲更新url,對搜索引擎友好


免責聲明!

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



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