歡迎您光臨本站 註冊首頁

nginx自定義變量與內置預定義變量的使用

←手機掃碼閱讀     retouched @ 2020-06-23 , reply:0

總覽
 

nginx可以使用變量簡化配置與提高配置的靈活性,所有的變量值都可以通過這種方式引用:
 

  $變量名

 

而nginx中的變量分為兩種,自定義變量與內置預定義變量
 

內置變量
 

聲明
 

可以在sever,http,location等標籤中使用set命令(非唯一)聲明變量,語法如下
 

  set $變量名 變量值

 

注意nginx中的變量必須都以$開頭。
 

可見性
 

nginx的配置文件中所有使用的變量都必須是聲明過的,否則nginx會無法啟動並打印相關異常日誌
 

nginx變量的一個有趣的特性就是nginx中沒一個變量都是全局可見的,而他們又不是全局變量。比如下面這個例子
 

  location a/ {   return 200 $a  }    location b/ {   set $a hello nginx   return 200 $a  }

 

由於變量是全局可見的所以nginx啟動不會報錯,而第一個location中並不知道$a的具體值因此返回的響應結果為一個空字符串。
 

在不同層級的標籤中聲明的變量性的可見性規則如下:

  • location標籤中聲明的變量中對這個location塊可見

  • server標籤中聲明的變量對server塊以及server塊中的所有子塊可見

  • http標籤中聲明的變量對http塊以及http塊中的所有子塊可見

內置預定義變量
 

內置預定義變量即無需聲明就可以使用的變量,通常包括一個http請求或響應中一部分內容的值,以下為一些常用的內置預定義變量
 

變量名定義
$arg_PARAMETERGET請求中變量名PARAMETER參數的值。
$args這個變量等於GET請求中的參數。例如,foo=123&bar=blahblah;這個變量只可以被修改
$binary_remote_addr二進制碼形式的客戶端地址。
$body_bytes_sent傳送頁面的字節數
$content_length請求頭中的Content-length字段。
$content_type請求頭中的Content-Type字段。
$cookie_COOKIEcookie COOKIE的值。
$document_root當前請求在root指令中指定的值。
$document_uri與$uri相同。
$host請求中的主機頭(Host)字段,如果請求中的主機頭不可用或者空,則為處理請求的server名稱(處理請求的server的server_name指令的值)。值為小寫,不包含端口。
$hostname機器名使用 gethostname系統調用的值
$http_HEADERHTTP請求頭中的內容,HEADER為HTTP請求中的內容轉為小寫,-變為_(破折號變為下劃線),例如:$http_user_agent(Uaer-Agent的值);
$sent_http_HEADERHTTP響應頭中的內容,HEADER為HTTP響應中的內容轉為小寫,-變為_(破折號變為下劃線),例如: $sent_http_cache_control, $sent_http_content_type…;
$is_args如果$args設置,值為"?",否則為""。
$limit_rate這個變量可以限制連接速率。
$nginx_version當前運行的nginx版本號。
$query_string與$args相同。
$remote_addr客戶端的IP地址。
$remote_port客戶端的端口。
$remote_user已經經過Auth Basic Module驗證的用戶名。
$request_filename當前連接請求的文件路徑,由root或alias指令與URI請求生成。
$request_body這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義。
$request_body_file客戶端請求主體信息的臨時文件名。
$request_completion如果請求成功,設為"OK";如果請求未完成或者不是一系列請求中最後一部分則設為空。
$request_method這個變量是客戶端請求的動作,通常為GET或POST。包括0.8.20及之前的版本中,這個變量總為main request中的動作,如果當前請求是一個子請求,並不使用這個當前請求的動作。
$request_uri這個變量等於包含一些客戶端請求參數的原始URI,它無法修改,請查看$uri更改或重寫URI。
$scheme所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr服務器地址,在完成一次系統調用後可以確定這個值,如果要繞開系統調用,則必須在listen中指定地址並且使用bind參數。
$server_name服務器名稱。
$server_port請求到達服務器的端口號。
$server_protocol請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$uri請求中的當前URI(不帶請求參數,參數位於args)args),不同於瀏覽器傳遞的request_uri的值,它可以通過內部重定向,或者使用index指令進行修改。不包括協議和主機名,例如/foo/bar.html

 

   


[retouched ] nginx自定義變量與內置預定義變量的使用已經有248次圍觀

http://coctec.com/docs/nginx/show-post-239481.html