1. 程式人生 > >Ngixn運維之七 if、set、return

Ngixn運維之七 if、set、return

Ngixn運維之七 if、set、return

set

Syntax: set $variable value;
Default: —
Context: server, location, if

set可以為變數設定值,值可以為字串/變數以及它們的組合。

例如:

set $s1 1;
set $s2 "${s1}1"

return

Syntax: return code [text]; return code URL; return URL;
Default

: —
Context: server, location, if

停止處理並且返回響應碼給客戶端,非標準程式碼444會在不傳送響應頭的情況下關閉連線。

從 0.8.42版本開始, 支援為狀態碼(for codes 301, 302, 303, 307, and 308)跳轉URL為其他的狀態碼返回返回體資料。返回體或者跳轉的URL支援包含變數。特殊情況,重定向URL可以指定為該伺服器的本地URI,在這種情況下,完整的跳轉URL依據請求 scheme ($scheme) 和the server_name_in_redirect and port_in_redirect 指令。

例如:
請求重定向到一個新域名

location = /test {
		return 301 $scheme://www.example.com$request_uri;
       	}

請求直接返回資料

        location ^~ /getIP {
            default_type text/html;
            return 200 '[$remote_addr]';
        }

if

Syntax: if (condition) { … }
Default: —
Context: server, location

對特定的條件進行判斷,如果為true,括號內將會被執行。

正則表示式匹配:

  • =:等值比較;
  • ~:區分大小寫的正則表示式模式匹配
  • ~*:不區分大小寫的正則表示式模式匹配
  • !~:區分大小寫的正則表示式模式不匹配
  • !~*:不區分大小寫的正則表示式模式不匹配

檔案及目錄匹配判斷:

  • -f, !-f:判斷指定的路徑是否為存在且為檔案;
  • -d, !-d:判斷指定的路徑是否為存在且為目錄;
  • -e, !-e:判斷指定的路徑是否存在,檔案或目錄均可;
  • -x, !-x:判斷指定路徑的檔案是否存在且可執行;

例如:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

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

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

AND,OR多重判斷

nginx的配置中不支援if條件的&& ||運算 ,並且不支援if的巢狀語法,但是我們可以用變數的方式來實現:

具體方法為AND 就用變數疊加,OR就用0或1切換。

例如我們的目標(虛擬碼):

if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") {
  return 403;
}

我們可以這麼做

set $flag 0;
if ($remote_addr ~ "^(12.34|56.78)") {
  set $flag "${flag}1";
}
if ($http_user_agent ~* "spider") {
  set $flag "${flag}2";
}
if ($flag = "012") {
  return 403;
}