1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    Nginx的rewrite模塊詳解_nginx

    來源:腳本之家  責任編輯:小易  

    rewrite模塊即ngx_http_rewrite_module模塊,主要功能是改寫請求URI,是Nginx默認安裝的模塊。rewrite模塊會根據PCRE正則匹配重寫URI,然后發起內部跳轉再匹配location,或者直接做30x重定向返回客戶端。

    指令執行順序
    首先順序執行server塊中的rewrite模塊指令,得到rewrite后的請求URI
    然后循環執行如下指令

    如果沒有遇到中斷循環標志,此循環最多執行10次,但是我們可以使用break指令來中斷rewrite后的新一輪的循環
    (1). 依據rewrite后的請求URI,匹配定義的 location 塊

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

    指令
    break
    Context: server, location, if
    停止執行 ngx_http_rewrite_module 的指令集,但是其他模塊指令是不受影響的

    例子說明

    server {
     listen 8080;
     # 此處 break 會停止執行 server 塊的 return 指令(return 指令屬于rewrite模塊)
     # 如果把它注釋掉 則所有請求進來都返回 ok
     break;
     return 200 "ok";
     location = /testbreak {
      break;
      return 200 $request_uri;
      proxy_pass http://127.0.0.1:8080/other;
     }
     location / {
      return 200 $request_uri;
     }
    }
    
    # 發送請求如下
    # curl 127.0.0.1:8080/testbreak
    # /other
    
    # 可以看到 返回 `/other` 而不是 `/testbreak`,說明 `proxy_pass` 指令還是被執行了
    # 也就是說 其他模塊的指令是不會被 break 中斷執行的
    # (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則可以是變量也可是字符串, -f/-d/-e/-x 基本用法和 bash 是一致的.

    set $variable "0"; 
    if ($variable) {
     # 不會執行,因為 "0" 為 false
     break;   
    }
    
    # 使用變量與正則表達式匹配 沒有問題
    if ( $http_host ~ "^star\.igrow\.cn$" ) {
     break;   
    }
    
    # 字符串與正則表達式匹配 報錯
    if ( "star" ~ "^star\.igrow\.cn$" ) {
     break;   
    }
    # 檢查文件類的 字符串與變量均可
    if ( !-f "/data.log" ) {
     break;   
    }
    
    if ( !-f $filename ) {
     break;   
    }

    return

    Context: server, location, if
    return code [text];
    return code URL;
    return URL;

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

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

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

    # return code [text]; 返回 ok 給客戶端
    location = /ok {
     return 200 "ok";
    }
    
    # return code URL; 臨時重定向到 百度
    location = /redirect {
     return 302 http://www.baidu.com;
    }
    
    # return URL; 和上面一樣 默認也是臨時重定向
    location = /redirect {
     return http://www.baidu.com;
    }

    rewrite

    Context: server, location, if


    rewrite regex replacement [flag];

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

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

    location / {
     # 當匹配 正則表達式 /test1/(.*)時 請求將被臨時重定向到 http://www.$1.com
     # 相當于 flag 寫為 redirect
     rewrite /test1/(.*) http://www.$1.com;
     return 200 "ok";
    }
    # 在瀏覽器中輸入 127.0.0.1:8080/test1/baidu 
    # 則臨時重定向到 www.baidu.com
    # 后面的 return 指令將沒有機會執行了

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

    location / {
     rewrite /test1/(.*) www.$1.com;
     return 200 "ok";
    }
    # 發送請求如下
    # curl 127.0.0.1:8080/test1/baidu
    # ok
    
    # 此處沒有帶http:// 所以只是簡單的重寫。請求的 uri 由 /test1/baidu 重寫為 www.baidu.com
    # 因為會順序執行 rewrite 指令 所以 下一步執行 return 指令 響應了 ok

    rewrite 的四個 flag

    1.last
    停止處理當前的ngx_http_rewrite_module的指令集,并開始搜索與更改后的URI相匹配的location; (因為 last 英文含義是"繼續", 會繼續嘗試匹配跳轉其他 location)
    2.break
    停止處理當前的ngx_http_rewrite_module指令集,就像上面說的break指令一樣; (break 是"中斷停止")
    3.redirect
    返回302臨時重定向。(可以理解是"臨時租房")
    4.permanent
    返回301永久重定向。(可以理解是"搬新家")

    # 沒有rewrite 后面沒有任何 flag 時就順序執行 
    # 當 location 中沒有 rewrite 模塊指令可被執行時 就重寫發起新一輪location匹配
    location / {
     # 不加 flag, 默認順序執行
     rewrite ^/test1 /test2;
     rewrite ^/test2 /test3; # 此處發起新一輪location匹配 uri為/test3
    }
    
    location = /test2 {
     return 200 "/test2";
    } 
    
    location = /test3 {
     return 200 "/test3";
    }
    # 發送如下請求
    # curl 127.0.0.1:8080/test1
    # /test3

    last 與 break 的區別

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


    location / {
     rewrite ^/test1 /test2;
     rewrite ^/test2 /test3 last; # 此處發起新一輪location匹配 uri為/test3
     rewrite ^/test3 /test4;
     proxy_pass http://www.baidu.com;
    }
    
    location = /test2 {
     return 200 "/test2";
    } 
    
    location = /test3 {
     return 200 "/test3";
    }
    location = /test4 {
     return 200 "/test4";
    }
    # 發送如下請求
    # curl 127.0.0.1:8080/test1
    # /test3 
    
    當如果將上面的 location / 改成如下代碼
    location / {
     rewrite ^/test1 /test2;
     # 此處 不會 發起新一輪location匹配;當是會終止執行后續rewrite模塊指令 重寫后的uri為 /more/index.html
     rewrite ^/test2 /more/index.html break; 
     rewrite /more/index\.html /test4; # 這條指令會被忽略
    
     # 因為 proxy_pass 不是rewrite模塊的指令 所以它不會被 break終止
     proxy_pass https://www.baidu.com;
    }
    # 發送如下請求
    # 瀏覽器輸入 127.0.0.1:8080/test1 
    # 代理到 百度產品大全頁面 https://www.baidu.com/more/index.html;

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

    # 由于最后加了個 ?,原來的請求參數將不會被追加到rewrite之后的url后面 
    rewrite ^/users/(.*)$ /show?user=$1? last;

    rewrite_log

    Context: http, server, location, if

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

    Syntax: rewrite_log on | off;

    set

    Context: server, location, if

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

    location / {
     set $var1 "host is ";
     set $var2 $host;
     set $var3 " uri is $request_uri";
     return 200 "response ok $var1$var2$var3";
    }
    # 發送如下請求
    # curl 127.0.0.1:8080/test
    # response ok host is 127.0.0.1 uri is /test

    uninitialized_variable_warn

    Context: http, server, location, if

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

    內部實現

    該ngx_http_rewrite_module模塊指令是在配置階段編譯成被請求處理過程中解釋內部指示。解釋器是一個簡單的虛擬堆棧機。

    例如,指令

    location /download/ { if ( f o r b i d d e n ) r e t u r n 403 ; i f ( forbidden) { return 403; } if ( forbidden)return403;if(slow) { limit_rate 10k; } rewrite ^/(download/.)/media/(.)…*$ /$1/mp3/$2.mp3 break; }

    將被翻譯成以下說明:

    variable $forbidden check against zero return 403 end of code variable $slow check against zero match of regular expression copy “/” copy $1 copy “/mp3/” copy $2 copy “.mp3” end of regular expression end of code

    請注意, 上面的limit_rate指令沒有任何 指令,因為它與ngx_http_rewrite_module模塊無關 。為if塊創建一個單獨的配置。如果條件成立,則將為此配置分配一個請求,該請求limit_rate等于10k。\

    指令

    rewrite ^/(download/.)/media/(.)…*$ /$1/mp3/$2.mp3 break;

    如果正則表達式中的第一個斜杠放在括號內,則可以簡化:

    rewrite ^(/download/.)/media/(.)…*$ $1/mp3/$2.mp3 break;

    相應的指令將如下所示:

    match of regular expression copy $1 copy “/mp3/” copy $2 copy “.mp3” end of regular expression end of code

    location (非 rewrite模塊)

    語法

    在server塊中使用,如:

    server{ location 表達式 { }

    location表達式類型

    如果直接寫一個路徑,則匹配該路徑下的 表示執行一個正則匹配,區分大小寫
    ~* 表示執行一個正則匹配,不區分大小寫
    ^~ 表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他location。
    = 進行普通字符精確匹配。也就是完全匹配。

    優先級
    1.等號類型(=)的優先級最高。一旦匹配成功,則不再查找其他匹配項。
    2.^~類型表達式。一旦匹配成功,則不再查找其他匹配項。
    3.正則表達式類型(~ ~*)的優先級次之。如果有多個location的正則能匹配的話,則使用正則表達式最長的那個。
    4.常規字符串匹配類型。按前綴匹配。

    到此這篇關于Nginx的rewrite模塊詳解的文章就介紹到這了,更多相關Nginx的rewrite內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:Nginx rewrite正則匹配重寫的方法示例nginx rewrite 實現URL跳轉的方法詳解常用的nginx rewrite重寫規則nginx配置location總結location正則寫法及rewrite規則寫法詳解nginx配置location總結及rewrite規則寫法詳解nginx rewrite和根據url參數location

  3. 本文相關:
  4. 在nginx中實現單位時間內限制訪問頻率的教程
  5. 在nginx瀏覽器中打開目錄瀏覽功能
  6. nginx+iis簡單的部署教程
  7. nginx配置basic auth登錄認證的實現方法
  8. nginx添加ssl模塊的方法教程
  9. crontab+shell做nginx日志切割腳本實例代碼
  10. nginx 設置域名轉發到指定端口的實現方法
  11. nginx反向代理之多端口映射的實現
  12. nginx服務器中設置禁止訪問文件或目錄的方法
  13. 高并發nginx服務器的linux內核優化配置講解
  14. 怎么理解 nginx 中 rewrite 的用法
  15. 幫我詳細解釋一下nginx下的這句rewrite,謝謝
  16. 編譯安裝nginx時停用了rewrite模塊,怎么重新開啟
  17. 關于nginx的rewrite(偽靜態)規則修改
  18. 關于nginx中的rewrite問題
  19. 怎么查看 nginx 支持rewrite
  20. freebad下面nginx如何開啟rewrite模塊?
  21. nginx與apache 的rewrite有什么區別
  22. nginx if rewrite模塊怎么寫
  23. nginx如何啟用ngx_http_rewrite_module
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全星外虛擬主機華眾虛擬主機linuxwin服務器ftp服務器dns服務器tomcat nginxzabbix云和虛擬化服務器其它首頁服務器nginx rewrite正則匹配重寫的方法示例nginx rewrite 實現url跳轉的方法詳解常用的nginx rewrite重寫規則nginx配置location總結location正則寫法及rewrite規則寫法詳解nginx配置location總結及rewrite規則寫法詳解nginx rewrite和根據url參數location在nginx中實現單位時間內限制訪問頻率的教程在nginx瀏覽器中打開目錄瀏覽功能nginx+iis簡單的部署教程nginx配置basic auth登錄認證的實現方法nginx添加ssl模塊的方法教程crontab+shell做nginx日志切割腳本實例代碼nginx 設置域名轉發到指定端口的實現方法nginx反向代理之多端口映射的實現nginx服務器中設置禁止訪問文件或目錄的方法高并發nginx服務器的linux內核優化配置講解nginx提示:500 internal servernginx 多站點配置方法集合權限問題導致nginx 403 forbiddenginx fastcgi錯誤primary scripnginx服務器的反向代理proxy_pasnginx 403 forbidden的解決辦法詳解nginx服務器中配置超時時間的nginx偽靜態配置和常用rewrite偽nginx下301重定向域名的方法小結windows下nginx+php5的安裝與配置nginx優化配置和內核優化 實現突破十萬并nginx的超時timeout配置詳解如何讓nginx支持中文文件名具體設置步驟linux下給nginx安裝waf模塊nginx實現不同域名輸出不同的服務器頭信息nginx+tomcat實現windows系統下的負載均衡nginx服務器作反向代理時的緩存配置要點解nginx http運行狀況健康檢查配置過程解析nginx實現異步訪問mysql的配置方法nginx 虛擬主機配置的三種方式(基于域名)
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载