Nginx配置中的if判斷


當rewrite的重寫規則滿足不了需求時,比如需要判斷當文件不存在時、當路徑包含xx時等條件,則需要用到if

if語法

if (表達式) { ... }

表達式語法:

1、正則表達式匹配:

==:等值比較;

~:與指定正則表達式模式匹配時返回“真”,判斷匹配與否時區分字符大小寫;

~*:與指定正則表達式模式匹配時返回“真”,判斷匹配與否時不區分字符大小寫;

!~:與指定正則表達式模式不匹配時返回“真”,判斷匹配與否時區分字符大小寫;

!~*:與指定正則表達式模式不匹配時返回“真”,判斷匹配與否時不區分字符大小寫;

 

2、文件及目錄匹配判斷:

-f, !-f:判斷指定的路徑是否為存在且為文件;

-d, !-d:判斷指定的路徑是否為存在且為目錄;

-e, !-e:判斷指定的路徑是否存在,文件或目錄均可;

-x, !-x:判斷指定路徑的文件是否存在且可執行;

 

為了配置if的條件判斷,這里需要用到nginx中內置的全局變量

$args               這個變量等於請求行中的參數,同$query_string
$content_length     請求頭中的Content-length字段。
$content_type       請求頭中的Content-Type字段。 $document_root 當前請求在root指令中指定的值。 $host 請求主機頭字段,否則為服務器名稱。 $http_user_agent 客戶端agent信息 $http_cookie 客戶端cookie信息 $limit_rate 這個變量可以限制連接速率。 $request_method 客戶端請求的動作,通常為GET或POST。 $remote_addr 客戶端的IP地址。 $remote_port 客戶端的端口。 $remote_user 已經經過Auth Basic Module驗證的用戶名。 $request_filename 當前請求的文件路徑,由root或alias指令與URI請求生成。 $scheme HTTP方法(如http,https)。 $server_protocol 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。 $server_addr 服務器地址,在完成一次系統調用后可以確定這個值。 $server_name 服務器名稱。 $server_port 請求到達服務器的端口號。 $request_uri 包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。 $uri 不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。 $document_uri 與$uri相同。

舉例說明

1、如果文件不存在則返回400

if (!-f $request_filename) { return 400; }

2、如果host不是jouypub.com,則301到jouypub.com中

if ( $host != 'jouypub.com' ){ rewrite ^/(.*)$ https://jouypub.com/$1 permanent; }

3、如果請求類型不是POST則返回405

if ($request_method = POST) { return 405; }

4、如果參數中有a=1則301到指定域名

if ($args ~ a=1) { rewrite ^ http://example.com/ permanent; }

5、在某種場景下可結合location規則來使用,如:

# 訪問 /test.html 時 location = /test.html { # 設置默認值為xiaowu set $name xiaowu; # 如果參數中有 name=xx 則使用該值 if ($args ~* name=(\w+?)(&|$)) { set $name $1; } # 301 rewrite ^ /$name.html permanent; }

上面表示:

/test.html => /xiaowu.html


免責聲明!

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



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