Nginx配置中的if判斷

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

if語法

if (表達式) {
    ...
}

表達式語法:html

  1. 當表達式只是一個變量時,若是值爲空或任何以0開頭的字符串都會當作false
  2. 直接比較變量和內容時,使用=或!=
  3. -f和!-f用來判斷是否存在文件
  4. -d和!-d用來判斷是否存在目錄
  5. -e和!-e用來判斷是否存在文件或目錄
  6. -x和!-x用來判斷文件是否可執行

爲了配置if的條件判斷,這裏須要用到nginx中內置的全局變量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相同。

舉例說明

一、若是文件不存在則返回400segmentfault

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

二、若是host不是jouypub.com,則301到jouypub.com中服務器

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

三、若是請求類型不是POST則返回405cookie

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

四、若是參數中有a=1則301到指定域名學習

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

五、在某種場景下可結合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
/test.html?name=ok => /ok.html?name=okspa



歡迎訂閱「K叔區塊鏈」 - 專一於區塊鏈技術學習

博客地址: http://www.jouypub.com
簡書主頁: https://www.jianshu.com/u/756c9c8ae984
segmentfault主頁: https://segmentfault.com/blog/jouypub
騰訊雲主頁: https://cloud.tencent.com/developer/column/72548
相關文章
相關標籤/搜索