nginx - 全局變量和指令


nginx - 全局變量和指令

全局變量

下面是可以用作if判斷的全局變量

$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相同。

$host_host變量,和$host區別如下:

$host不帶端口,$http_host帶端口

例:http://localhost:88/test1/test2/test.php

$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php

if判斷指令

語法為if(condition){...},對給定的條件condition進行判斷。如果為真,大括號內的rewrite指令將被執行,if條件(conditon)可以是如下任何內容:

  • 當表達式只是一個變量時,如果值為空或任何以0開頭的字符串都會當做false
  • 直接比較變量和內容時,使用=!=
  • ~正則表達式匹配,~*不區分大小寫的匹配,!~區分大小寫的不匹配

注意:使用正則表達式字符串一般不需要加引號,但是如果含有右花括號“}”或者分號“;”字符時,必須要給整個正則表達式加引號

其他指令:

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

break指令

用於中斷當前相同作用域中的Nginx配置,和Java中的break語法類似,可以在server塊和location以及if塊中使用。

語法:break;

return指令

該指令用於完成對請求的處理,直接向客戶端響應狀態的代碼。和Java中的return語法類似。可以再server塊和location以及if塊中使用。
語法:return code URL; #code表示狀態碼,URL表示返回給客戶單的URL地址
或者:return URL: #當狀態碼是302或者307的時候,可以使用,返回的URL必須包含“http://”、“https://”或者直接使用“$scheme”變量(RequestScheme代表傳輸協議,
Nginx內置變量)
或者 return [text]; #為返回給客戶端的響應體內容,支持變量的使用

rewrite指令

該指令通過正則表達式的使用來改變URI.可以同時存在一個或者多個指令,按照順序一次對URL進行匹配和處理。該指令可以在server塊后者location塊中配置

語法:

指令語法:rewrite regex replacement [flag];

rewrite:是實現URL重定向的重要指令,  
regex:用來匹配URI的正則表達式;
replacement:匹配成功后用來替換URI中被截取內容的字符串,默認情況如果該字符串包含“http://”、"https://"開頭,則不會繼續向下對URI進行其他處理。直接返回重寫的URI給客戶端
flag:用來設置rewrite對URI的處理行為,包含如下數據:

傳參

rewrite ^/test.php /new permanent; //重寫向帶參數的地址
rewrite ^/test.php /new? permanent; //重定向后不帶參數
rewrite ^/test.php /new?id=$arg_id? permanent; //重定向后帶指定的參數

rewrite_log指令

該指令用於是否開啟URL重寫日志的輸出,

語法:

rewrite_log on | off

默認是off,如果配置為on,URL重寫的相關日志將以notice級別輸出到error_log指令配置的日志文件中

set指令

用來設置新的變量,

語法: set variable value;

variable,這個是變量的名稱,這個符號的“$”必須作為變量第一個字符,並且不能和Nginx服務器預設的全局變量同名

value,為變量的值。

比如 set $id “3”; #設置id為3

uninitialized_variable_warn指令

這個指令用來配置會用未初始化的變量時,是否記錄警告日志,
語法: unitialized_variable_warn on | off
默認設置時on狀態

防盜鏈

語法:
valid_referers none | blocked | server_name | string ...;
這里表示請求頭部Referer域是否匹配上面值,如果匹配了$invalid_referer 的值為0,沒有相匹配就是1;

example:

if (-f  $request_filename){
        … #判斷請求的文件是否存在,存在就執行這里面的代碼塊
}

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite請求到/msid/目錄下
 
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
 } //如果cookie匹配正則,設置變量$id等於正則引用部分
 
if ($request_method = POST) {
    return 405;
} //如果提交方法為POST,則返回狀態405(Method not allowed)。return不能返回301,302
 
if ($slow) {
    limit_rate 10k;
} //限速,$slow可以通過 set 指令設置
 
if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1; 
} //如果請求的文件名不存在,則反向代理到localhost 。這里的break也是停止rewrite檢查
 
if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com
 
location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.leizhenfang.com;
    if ($invalid_referer) {
        return 404;
    } //防盜鏈
}

參考資料

nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置
Nginx if指令與全局變量


免責聲明!

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



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