Nginx正規表示式與HttpRewrite模組

2021-09-25 13:53:55 字數 4039 閱讀 4157

nginx 正規表示式使用的是pcre,pcre庫是一組函式,它們使用與perl 5相同的語法和語義實現正規表示式模式匹配.pcre具有自己的本機api,以及一組與posix正規表示式api對應的包裝函式。pcre庫是免費的,即使是用於構建專有軟體。

注:小括號()之間匹配的內容,可以在後面通過$1來引用,$2表示的是前面第二個()裡的內容。

linux 下的 grep 工具:grep -p 命令

$ echo 'a.gif' | grep -p '\.(jp?g|gif|bmp|png)'

#輸出a.gif

* $args					請求中的引數;

* $binary_remote_addr 遠端位址的二進位制表示

* $body_bytes_sent 已傳送的訊息體位元組數

* $content_length http請求資訊裡的"content-length";

* $content_type 請求資訊裡的"content-type";

* $document_root 針對當前請求的根路徑設定值;

* $document_uri 與$uri相同;

* $host 請求資訊中的"host",如果請求中沒有host行,則等於設定的伺服器名;

* $hostname

* $http_cookie cookie 資訊

* $http_referer 引用位址

* $http_user_agent 客戶端**資訊

* $http_via 最後乙個訪問伺服器的ip位址。

* $http_x_forwarded_for 相當於網路訪問路徑。

* $is_args

* $limit_rate 對連線速率的限制;

* $nginx_version

* $pid

* $query_string 與$args相同;

* $realpath_root

* $remote_addr 客戶端位址;

* $remote_port 客戶端埠號;

* $remote_user 客戶端使用者名稱,認證用;

* $request 使用者請求

* $request_body

* $request_body_file 發往後端的本地檔名稱

* $request_completion

* $request_filename 當前請求的檔案路徑名

* $request_method 請求的方法,比如"get"、"post"等;

* $request_uri 請求的uri,帶引數;

* $scheme 所用的協議,比如http或者是https,比如rewrite^(.+)$$scheme:

* $server_addr 伺服器位址,如果沒有用listen指明伺服器位址,使用這個變數將發起一次系統呼叫以取得位址(造成資源浪費);

* $server_name 請求到達的伺服器名;

* $server_port 請求到達的伺服器端口號;

* $server_protocol 請求的協議版本,"http/1.0"或"http/1.1";

* $uri 請求的uri,可能和最初的值有不同,比如經過重定向之類的。

該模組允許使用正規表示式改變uri,並且根據變數來轉向以及選擇配置。如果在server級別設定該選項,那麼他們將在location之前生效。如果在location還有更進一步的重寫規則,location部分的規則依然會被執行。如果這個uri重寫是因為location部分的規則造成的,那麼location部分會再次被執行作為新的uri

語法 break

作用域:server,location,if

作用是完成當前的規則列

示例

if ($slow)
if判斷指令

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

作用域: server, location

-f和!-f用來判斷是否存在檔案

-d和!-d用來判斷是否存在目錄

-e和!-e用來判斷是否存在檔案或目錄

-x和!-x用來判斷檔案是否可執行

示例

if ($http_user_agent ~ msie) 

if ($invalid_referer)

語法:return code

作用域: server, location, if

這個指令根據規則的執**況,返回乙個狀態值給客戶端。可使用值包括:204,400,402-406,408,410,411,413,416以及500-504。也可以傳送非標準的444**-未傳送任何頭資訊下結束連線

語法: rewrite regex replacement flag

預設: none

作用域: server, location, if

這個指令根據表示式來更改uri,或者修改字串。指令根據配置檔案中的順序來執行。

注意重寫表示式只對相對路徑有效。如果你想配對主機名,你應該使用if語句,如下

if ($host ~* www\.(.*))
需要注意的是rewrite後面的第乙個正則引數永遠是只對uri進行匹配,而不是對完整的帶主機頭的url,如上例中,if語句來判斷主機頭,如果匹配www.(.*),則設定乙個變數katex parse error: can't use function '\.' in math mode at position 23: …thout_www的值為www\̲.̲(.*)的引用,如果上例中的請…host_without_www的值為mydomain.com,而下面的rewrite指令中,第乙個正規表示式的引用將為/foo,則最終通過這個重寫後的請求url為

location ~*  ^/static/.*\.jpg$
匹配/static/開頭,.jpg 結尾的請求中,將所有/static/css/開頭的請求去掉/static/css

nginx rewrite 實現二級網域名稱跳轉

當訪問跳轉到

方法一:這種方法瀏覽器位址會變www.jbxue.com/test/abc

server 

}server

}

方法二:當訪問跳轉到

server 

location /

rewrite ^/(.*) /test/$domain/$1 last;

}access_log off;

}

標誌位

last一般寫在server和if中,而break一般使用在location中

last不終止重寫後的url匹配,即新的url會再從server走一遍匹配流程,而break終止重寫後的匹配

break和last都能組織繼續執行後面的rewrite指令

語法:設定變數值

作用域:server,location,if

指令為指示的變數建立值。 作為值,可以使用文字,變數及其組合

nginx正規表示式

1 nginx配置基礎 1 正規表示式匹配 區分大小寫匹配 不區分大小寫匹配 和 分別為區分大小寫不匹配及不區分大小寫不匹配 以什麼開頭的匹配 以什麼結尾的匹配 轉義字元。可以轉.等 代表任意字元 2 檔案及目錄匹配 f和 f用來判斷是否存在檔案 d和 d用來判斷是否存在目錄 e和 e用來判斷是否存...

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式作http請求

引用名稱 後邊使用引數引用的方式引用這個提取器提取到的值,這裡命名為token,使用時寫 正規表示式 使用 進行匹配提取,兩邊是要提取內容的邊界 如上乙個請求的響應資料 要提取access token的值,也就是斜體部分,表示式可寫成 access token expired in 注意斜體部分兩邊...