nginx 的 rewrite 模塊

ngxhttprewrite_module 模塊用來使用正則表達式(PCRE)改變請求的 URI,返回重定向,并有條件地選擇配置。

指令執行順序

  1. 首先順序執行 server 塊中的 rewrite 模塊指令,得到 rewrite 后的請求 URI

  2. 然后循環執行如下指令 > 如果沒有遇到中斷循環標志,此循環最多執行 10 次,但是我們可以使用 break 指令來中斷 rewrite 后的新一輪的循環

(1). 依據 rewrite 后的請求 URI,匹配定義的 location 塊

(2). 順序執行匹配到的 location 中的 rewrite 模塊指令

指令

break

Context: server, location, if

停止執行 ngxhttprewrite_module 的指令集,但是其他模塊指令是不受影響的 例子說明

 
  1. server {

  2. ? ?listen 8080;

  3. ? ?# 此處 break 會停止執行 server 塊的 return 指令(return 指令屬于 rewrite 模塊)

  4. ? ?# 如果把它注釋掉 則所有請求進來都返回 ok

  5. ? ?break;

  6. ? ?return 200 "ok";

  7. ? ?location = /testbreak {

  8. ? ? ? ?break;

  9. ? ? ? ?return 200 $request_uri;

  10. ? ? ? ?proxy_pass http://127.0.0.1:8080/other;

  11. ? ?}

  12. ? ?location / {

  13. ? ? ? ?return 200 $request_uri;

  14. ? ?}

  15. }

  16. ?

  17. # 發送請求如下

  18. # curl 127.0.0.1:8080/testbreak

  19. # /other

  20. ?

  21. # 可以看到 返回 `/other` 而不是 `/testbreak`,說明 `proxy_pass` 指令還是被執行了

  22. # 也就是說 其他模塊的指令是不會被 break 中斷執行的

  23. # (proxy_pass是ngx_http_proxy_module的指令)

if

Context: server, location

依據指定的條件決定是否執行 if 塊語句中的內容

if 中的幾種 判斷條件

  1. 一個?變量名,如果變量 $variable 的值為空字符串或者字符串"0",則為 false

  2. 變量與一個字符串的比較 相等為(=) 不相等為(!=)?注意此處不要把相等當做賦值語句啊

  3. 變量與一個正則表達式的模式匹配 操作符可以是(?~?區分大小寫的正則匹配,?~*不區分大小寫的正則匹配,?!~?!~*,前面兩者的非)

  4. 檢測文件是否存在 使用?-f(存在) 和?!-f(不存在)

  5. 檢測路徑是否存在 使用?-d(存在) 和?!-d(不存在) 后面判斷可以是字符串也可是變量

  6. 檢測文件、路徑、或者鏈接文件是否存在 使用?-e(存在) 和?!-e(不存在) 后面判斷可以是字符串也可是變量

  7. 檢測文件是否為可執行文件 使用?-x(可執行) 和?!-x(不可執行) 后面判斷可以是字符串也可是變量

注意 上面 第1,2,3條被判斷的必須是 變量, 4, 5, 6, 7則可以是變量也可是字符串

 
  1. set $variable "0";

  2. if ($variable) {

  3. ? ?# 不會執行,因為 "0" 為 false

  4. ? ?break; ? ? ? ? ? ?

  5. }

  6. ?

  7. # 使用變量與正則表達式匹配 沒有問題

  8. if ( $http_host ~ "^star\.igrow\.cn$" ) {

  9. ? ?break; ? ? ? ? ? ?

  10. }

  11. ?

  12. # 字符串與正則表達式匹配 報錯

  13. if ( "star" ~ "^star\.igrow\.cn$" ) {

  14. ? ?break; ? ? ? ? ? ?

  15. }

  16. # 檢查文件類的 字符串與變量均可

  17. if ( !-f "/data.log" ) {

  18. ? ?break; ? ? ? ? ? ?

  19. }

  20. ?

  21. if ( !-f $filename ) {

  22. ? ?break; ? ? ? ? ? ?

  23. }

return

Context: server, location, if

 
  1. return code [text];

  2. return code URL;

  3. return URL;

停止處理并將指定的 code碼返回給客戶端。 非標準 code碼 444 關閉連接而不發送響應報頭。

0.8.42版本開始, return 語句可以指定重定向 url (狀態碼可以為如下幾種 301,302,303,307), 也可以為其他狀態碼指定響應的文本內容,并且重定向的 url和響應的文本可以包含 變量

有一種特殊情況,就是重定向的 url可以指定為此服務器本地的 urI,這樣的話, nginx會依據請求的協議 $schemeserver_name_in_redirectport_in_redirect自動生成完整的 url(此處要說明的是 server_name_in_redirectport_in_redirect 指令是表示是否將 server塊中的 server_namelisten 的端口 作為 redirect用 )

 
  1. # return code [text]; 返回 ok 給客戶端

  2. location = /ok {

  3. ? ?return 200 "ok";

  4. }

  5. ?

  6. # return code URL; 臨時重定向到 百度

  7. location = /redirect {

  8. ? ?return 302 http://www.baidu.com;

  9. }

  10. ?

  11. # return URL; 和上面一樣 默認也是臨時重定向

  12. location = /redirect {

  13. ? ?return http://www.baidu.com;

  14. }

rewrite

Context: server, location, if

 
  1. rewrite regex replacement [flag];

rewrite 指令是使用指定的正則表達式 regex來匹配請求的 urI,如果匹配成功,則使用 replacement更改 URIrewrite指令按照它們在配置文件中出現的順序執行。可以使用 flag標志來終止指令的進一步處理。如果替換字符串 replacementhttp://https://$ scheme開頭,則停止處理后續內容,并直接重定向返回給客戶端。

第一種情況 重寫的字符串 帶 http://

 
  1. location / {

  2. ? ?# 當匹配 正則表達式 /test1/(.*)時 請求將被臨時重定向到 http://www.$1.com

  3. ? ?# 相當于 flag 寫為 redirect

  4. ? ?rewrite /test1/(.*) http://www.$1.com;

  5. ? ?return 200 "ok";

  6. }

  7. # 在瀏覽器中輸入 127.0.0.1:8080/test1/baidu

  8. # 則臨時重定向到 www.baidu.com

  9. # 后面的 return 指令將沒有機會執行了

第二種情況 重寫的字符串 不帶 http://

 
  1. location / {

  2. ? ?rewrite /test1/(.*) www.$1.com;

  3. ? ?return 200 "ok";

  4. }

  5. # 發送請求如下

  6. # curl 127.0.0.1:8080/test1/baidu

  7. # ok

  8. ?

  9. # 此處沒有帶http:// 所以只是簡單的重寫。請求的 uri 由 /test1/baidu 重寫為 www.baidu.com

  10. # 因為會順序執行 rewrite 指令 所以 下一步執行 return 指令 響應了 ok

rewrite 的四個 flag

  1. last?停止處理當前的?ngx_http_rewrite_module的指令集,并開始搜索與更改后的?URI相匹配的?location;

  2. break?停止處理當前的?ngx_http_rewrite_module指令集,就像上面說的?break指令一樣;

  3. redirect?返回302臨時重定向。

  4. permanent?返回301永久重定向。

    ?

 
  1. # 沒有rewrite 后面沒有任何 flag 時就順序執行

  2. # 當 location 中沒有 rewrite 模塊指令可被執行時 就重寫發起新一輪location匹配

  3. location / {

  4. ? ?# 順序執行如下兩條rewrite指令

  5. ? ?rewrite ^/test1 /test2;

  6. ? ?rewrite ^/test2 /test3; ?# 此處發起新一輪location匹配 uri為/test3

  7. }

  8. ?

  9. location = /test2 {

  10. ? ?return 200 "/test2";

  11. } ?

  12. ?

  13. location = /test3 {

  14. ? ?return 200 "/test3";

  15. }

  16. # 發送如下請求

  17. # curl 127.0.0.1:8080/test1

  18. # /test3

last 與 break 的區別

last 和 break一樣 它們都會終止此 location 中其他它rewrite模塊指令的執行, 但是 last 立即發起新一輪的 location 匹配 而 break 則不會

 
  1. location / {

  2. ? ?rewrite ^/test1 /test2;

  3. ? ?rewrite ^/test2 /test3 last; ?# 此處發起新一輪location匹配 uri為/test3

  4. ? ?rewrite ^/test3 /test4;

  5. ? ?proxy_pass http://www.baidu.com;

  6. }

  7. ?

  8. location = /test2 {

  9. ? ?return 200 "/test2";

  10. } ?

  11. ?

  12. location = /test3 {

  13. ? ?return 200 "/test3";

  14. }

  15. location = /test4 {

  16. ? ?return 200 "/test4";

  17. }

  18. # 發送如下請求

  19. # curl 127.0.0.1:8080/test1

  20. # /test3

  21. ?

  22. 當如果將上面的 location / 改成如下代碼

  23. location / {

  24. ? ?rewrite ^/test1 /test2;

  25. ? ?# 此處 不會 發起新一輪location匹配;當是會終止執行后續rewrite模塊指令 重寫后的uri為 /

  26. ? ?rewrite ^/test2 /more/index.html break; ?

  27. ? ?rewrite /more/index\.html /test4; # 這條指令會被忽略

  28. ?

  29. ? ?# 因為 proxy_pass 不是rewrite模塊的指令 所以它不會被 break終止

  30. ? ?proxy_pass https://www.baidu.com;

  31. }

  32. # 發送如下請求

  33. # 瀏覽器輸入 127.0.0.1:8080/test1

  34. # 代理到 百度產品大全頁面 https://www.baidu.com/more/index.html;

友情提醒下

此處提一下 在上面的代碼中即使將 proxy_pass 放在 帶有 breakrewrite上面它也是會執行的,這就要扯到 nginx的執行流程了。大家有興趣可以了解下。

rewrite 后的請求參數

如果替換字符串 replacement包含新的請求參數,則在它們之后附加先前的請求參數。如果你不想要之前的參數,則在替換字符串 replacement 的末尾放置一個問號,避免附加它們。

 
  1. # 由于最后加了個 ?,原來的請求參數將不會被追加到rewrite之后的url后面

  2. rewrite ^/users/(.*)$ /show?user=$1? last;

rewrite_log

Context: http, server, location, if

開啟或者關閉 rewrite模塊指令執行的日志,如果開啟,則重寫將記錄下 notice 等級的日志到 nginxerror_log 中,默認為關閉 off

 
  1. Syntax: ? ?rewrite_log on | off;

set

Context: server, location, if

設置指定變量的值。變量的值可以包含文本,變量或者是它們的組合形式。

 
  1. location / {

  2. ? ?set $var1 "host is ";

  3. ? ?set $var2 $host;

  4. ? ?set $var3 " uri is $request_uri";

  5. ? ?return 200 "response ok $var1$var2$var3";

  6. }

  7. # 發送如下請求

  8. # curl 127.0.0.1:8080/test

  9. # response ok host is 127.0.0.1 uri is /test

uninitializedvariablewarn

Context: http, server, location, if

控制是否記錄 有關未初始化變量的警告。默認開啟

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535409.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

所有的Python庫

庫名稱簡介 Chardet字符編碼探測器,可以自動檢測文本、網頁、xml的編碼。 colorama主要用來給文本添加各種顏色,并且非常簡單易用。 Prettytable主要用于在終端或瀏覽器端構建格式化的輸出。 difflib,[Python]標準庫,計算文本…

Oracle行轉列語法總結大全

一、decode語法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各種符號 之 含義

#!&#xff1a;符號能夠被內核識別成是一個腳本的開始&#xff0c;這一行必須位于腳本的首行 $0&#xff1a;當前腳本的名字 $#&#xff1a;輸入<調用>參數(腳本或函數的位置參數) 的個數&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…

Nginx的11個執行流程

1 Nginx簡介 Web服務器市場份額 Nginx [engine x] 最初由 Lgor Sysoev 編寫。根據 Netcraft 的數據&#xff0c;到2020年9月&#xff0c;Nginx 服務或代理了25.76&#xff05;站點&#xff0c;市場份額占到了約34.03&#xff05;。 Nginx 被廣泛用作&#xff1a; HTTP服務器…

Nginx的執行階段詳解

在了解nginx的執行階段前&#xff0c;先看一個例子 對echo不熟悉的&#xff0c;可以先看文章Nginx調試必備了解下echo擴展 回到上面這個例子&#xff0c;在server塊中配置這樣的location&#xff0c;你覺得輸出是什么樣子&#xff1f; 按照正常的邏輯&#xff0c;輸出應該是32 …

Docker掛了,數據如何找回

docker在實際使用中&#xff0c;讓運維人員詬病的&#xff0c;除了安全問題外&#xff0c;大概就是數據的問題了 很多人在初用docker的時候&#xff0c;很多時候都忘記或不知道docker中需要保留的數據需要掛載到宿主機文件夾到容器內部對應目錄&#xff08;當然除了掛載宿主機目…

TCP總結

TCP這些東西&#xff0c;基本每個程序猿都或多或少是掌握的了。雖然感覺在實際開發中沒有什么用武之處&#xff0c;但&#xff0c;面試他要問啊 而最近大家伙過完年&#xff0c;也都在準備春招&#xff0c;我也一樣。閱讀了一些okHttp源碼之后&#xff0c;又屁顛屁顛地跑回來重…

Shell 中各種括號的作用

一、小括號&#xff0c;圓括號&#xff08;&#xff09; 1、單小括號 () ①命令組。括號中的命令將會新開一個子shell順序執行&#xff0c;所以括號中的變量不能夠被腳本余下的部分使用。括號中多個命令之間用分號隔開&#xff0c;最后一個命令可以沒有分號&#xff0c;各命令和…

linux基線核查腳本

#!/bin/bash #version 2.0cat <<EOF ************************************************************************************* ***** linux基線檢查腳本 ***** ************************************************************************************* *…

LDAP命令介紹---dsreplication

可以使用此實用程序來配置服務器之間的復制, 以使服務器數據保持同步。要正確進行復制, 必須先使用 enable 子命令啟用復制, 然后再使用 initialize 子命令將一個服務器的內容初始化為另一個服務器的內容用法: dsreplication {子命令} {選項}可用子命令:disable對指定服務器中…

LDAP命令介紹---dsconfig

此實用程序可用于定義目錄服務器的基本配置 用法: dsconfig {子命令} {選項} 獲取子命令用法列表: --help-distribution 顯示與 分發 相關的子命令 --help-general-configuration 顯示與 一般配置 相關的子命令 --help-integration 顯示與 集成 相關的子命令 --…

LDAP命令介紹---dsconfig子命令----help-distribution顯示與分發相關的子命令

此實用程序可用于定義目錄服務器的基本配置用法: dsconfig {子命令} {選項}可用子命令:create-distribution-algorithm創建分發算法create-distribution-partition創建分發分區create-workflow-element --type distribution創建分發工作流元素create-global-index創建全局索引…

LDAP命令介紹---ldappasswordmodify口令修改操作

此實用程序可用于在目錄服務器中執行 LDAP 口令修改操作用法: ldappasswordmodify {選項}其中 {選項} 包括:-a, --authzID {authzID}應更改口令的用戶條目的授權 ID -A, --provideDNForAuthzID將綁定 DN 用作口令修改操作的授權 ID -n, --newPassword {newPassword}為目標用戶…

LDAP命令介紹---dstune

此實用程序可用于幫助您優化 OUD 目錄服務器。 您可以選擇自動或基于其他標準 (例如, 內存限制或服務器將包含的數據) 優化服務器用法: dstune {子命令} {選項}可用子命令:data-based使用描述目錄服務器將包含的數據的信息優化服務器。使用 --ldifFile 可基于 LDIF 文件的內容…

LDAP命令介紹---dsreplication--initialize

initialize 將目標服務器中指定基礎 DN 下的數據內容初始化為源服務器的內容。要正確進行復制, 在啟用復制后必須執行該操作 (也可以使用 initialize-all 達到該目的) initialize-all 對于正在復制其內容的所有服務器, 將它們指定基礎 DN 下的數據內容初始化為指定…

LDAP命令介紹---dsreplication--enable:DISABLE

enable 用法: dsreplication enable {選項} 更新服務器的配置以復制指定基礎 DN 下的數據。如果某個指定的服務器正在復制其他服務器中基礎 DN 下的數據, 執行此子命令將會更新所有服務器的配置 (因此, 對于每個添加到復制拓撲中的服務器, 將都能執行一次命令行)全局選項:請參…

LDAP命令介紹---import-ldif

[oracleoud bin]$ ./import-ldif --help 此實用程序可用于將 LDIF 數據導入目錄服務器后端用法: import-ldif {選項}其中 {選項} 包括:-l, --ldifFile {ldifFile}要導入的 LDIF 文件的路徑 -A, --templateFile {templateFile}用于生成導入數據的 MakeLDIF 模板的路徑 -a, --ap…

LDAP命令介紹---verify-index--驗證索引

[oraclelocalhost bin]$ ./verify-index -b "DCCOM" telephoneNumber 在解析命令行參數時出現錯誤: 參數 "telephoneNumber" 沒有以一個或兩個破折號開頭, 并且不允許未命名的結尾參數 此實用程序可用于確保基于 Berkeley DB Java Edition 的后端中的索引…

LDAP----manage-account

[oraclelocalhost bin]$ ./manage-account -D "cndirectory manager" -j pwd-file get-all \ > > --targetDN uidkvaughan,ouPeople,dcexample,dccom 在解析命令行參數時出現錯誤: 無法接受為參數 -j 提供的值 "pwd-file": 為參數 bindpwfile 指定…

LDAP組的概念以及命令

Oracle統一目錄支持組&#xff0c;組是作為單個對象管理的條目集合。通常&#xff0c;目錄管理員配置打印機組、軟件應用程序組、員工組等。在為一組用戶分配特殊訪問權限時&#xff0c;組尤其有用。例如&#xff0c;您可以配置一組訪問管理器&#xff0c;并分配權限&#xff0…