Nginx使用Reg-Ex和Flags Rewrite規則

簡介

rewrite可以根據您的條件將傳入的URL更改(重寫)到不一樣的URL是任何Web服務器的基本功能。php

Nginx重寫功能很是強大且靈活。html

咱們將在nginx重寫中解釋如下示例:linux

  1. Nginx重寫示例使用$1,$2,..
  2. 使用Nginx重寫建立控制器文件
  3. 在位置上下文中重寫中斷標誌
  4. 添加問號到Nginx重寫替換字符串
  5. 若是是Context和Rewrite Directive
  6. Nginx重寫標誌示例
  7. 捕獲Nginx重寫錯誤日誌文件中的命中

如下是nginx重寫的語法:nginx

rewrite reg-ex replacement [flag];

在上面:正則表達式

  • rewrite指令是ngx_http_rewrite_module模塊的一部分。
  • reg-ex - 這是您在此處指定的PCRE正則表達式。這將用於匹配傳入的請求URI。
  • replacement - 若是reqeust URI與reg-ex匹配,那麼Nginx將使用此替換字符串相應地更改請求URI
  • flag - 這將決定是否須要進一步處理重寫指令。在下面的一個例子中詳細解釋了這一點。

在nginx中,能夠在如下三個上下文中的任何一個內指定rewrite指令:server,location,ifcentos

1.使用$1,$2,...的Nginx重寫示例

如下是Nginx重寫指令的示例:瀏覽器

rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html last;

例如:服務器

  • url/data/www/html/test.php將被重寫爲url/data/www/linux/test.html
  • 在此示例中,當您使用test.php從瀏覽器調用原始URL時,它將根據上述重寫規則進行重寫,並將從/data/www/linux/提供test.html頁面

在上面的重寫規則中:ide

  • $1和$2將從原始URL捕獲不會更改的相應字符串
  • 替換字符串中的$1將匹配reg-ex中第一個括號()內的任何內容。在咱們的例子中,$1是/data/
  • 相似地,$2將匹配reg-ex中第二個括號()內的任何內容。因此,$2是(\w+),這是原始網址中/html/以後的任何單詞。在咱們的例子中,$2是測試
  • last - 此標誌將確保中止在當前位置或塊中搜索重寫指令並使用更改的URI(即重寫的URI)並查找匹配的任何進一步重寫指令的新位置。
    • $ - 這表示原始URL中的擴展名。請注意,在此處,原始URL的擴展名將被替換後的URL替換爲.html。所以,即便您在原始URL中調用.php,它也只會在重寫的URL中提供.html文件。

雖然Nginx重寫規則與Apache相似,但在如何在Nginx中編寫重寫規則方面仍存在不少差別。測試

2.使用Nginx重寫建立控制器文件

使用重寫,您能夠將許多傳入的原始URL路由到將爲這些請求提供服務的主控制器模板。

如下重寫示例解釋了這一點。

rewrite ^/linux/(.*)$ /linux.php?www=$1 last;

在上面的示例中,當您調用abcgo.com/linux/centos URL時,它將使用上述規則進行重寫,它將使用此重寫的URL提供頁面:abcgo.com/linux.php?www=centos

如上所示,任何與此處模式匹配的URL(即URL中的/linux/)都將由linux.php提供,但原始傳入URL中的最後一部分將用做發行版中的參數的值。 linux.php控制器。

所以,上述重寫規則將轉換傳入的URL,以下所示:

  • linux/centos成爲linux.php?www=centos
  • linux/debian成爲linux.php?www=debian
  • linux/redhat成爲linux.php?www=redhat
  • 等等

與前面的示例相似,咱們在替換字符串中使用$1來捕獲reg-ex中第一個括號()內的任何內容。在這種狀況下,這是原始傳入URL的最後一部分。

咱們還使用此處的最後一個標誌來指示nginx中止在當前塊中搜索進一步的重寫指令,並繼續移動到下一個匹配位置以進行進一步搜索。

3.在位置上下文中重寫中斷標誌

在這個例子中,咱們將重寫條件放在location指令中。

在此示例中,location指令是/data/,它還匹配下面給出的替換字符串中的$1。

location /data/ {
rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html break;
return  403;
}

若是你使用上面的「最後」標誌會發生這種狀況:

  • 所以,若是您將「last」做爲標誌,則在初始重寫URL以後,Nginx一般會查找新URL的下一個重寫指令。
  • 在這種狀況下,Nginx將繼續重定向到相同的位置數據並繼續處理相同的重寫規則最多10次,最後它將返回500錯誤代碼。

由於,咱們不但願出現上述行爲,咱們在這裏使用了「break」做爲標誌,它將再次中止處理重寫塊。

要在位置上下文中有效使用重寫指令,您須要瞭解位置如何工做的詳細信息

4.向Nginx重寫替換字符串添加問號

若是替換字符串包含新請求參數,則先前的請求參數將附加在它們以後。若是您不想要此行爲,請在替換字符串的末尾添加問號,以免添加它們。

在如下示例中,在替換字符串部分中,末尾沒有問號。即$1後無問號

rewrite ^/linux/(.*)$ /linux.php?www=$1 last;

在上面的示例中,當替換字符串包含傳入的請求參數時,以前請求的參數將附加在它們以後。

有時候,你可能不但願這種狀況發生。在那種狀況下,使用?以下所示。

在下面的例子中,在Nginx重寫的替換字符串部分中,咱們添加了?在末尾。即$1後有一個問號

rewrite ^/linux/(.*)$ /linux.php?www=$1? last;

在上面的示例中,替換字符串包含傳入的請求參數,而後不會在它們以後附加前一個請求的參數。

5.若是上下文和重寫指令

如下幾個示例說明咱們能夠在if指令中使用重寫。

您能夠經過使用$scheme,$http_host,$http_user_agent等變量進行條件比較來進行條件重寫,以下所示:

if ($scheme="http") {
  rewrite ^ https://www.abcgo.com$uri permanent;
}

if ($http_host=abcgo.com) {
  rewrite  (.*)  https://www.abcgo.com$1;
}

if ($http_user_agent=MSIE) {
    rewrite ^(.*)$ /pdf/$1 break;
}

請注意,有更好的方法能夠實現上述示例的最終結果。上面的例子只是爲了代表咱們能夠在nginx配置文件中的if語句中添加劇寫指令。

請注意,您還能夠在nginx配置文件中將如下兩個參數的值設置爲on或off:

server_name_in_redirect on 
port_in_redirect off

6. Nginx重寫標誌示例

如下是您可使用的4種不一樣的Nginx Rewrite指令標誌。

last:此標誌將中止處理當前集中的重寫指令,並將從與更改的URL匹配的新位置開始。

rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html last;

break:該標誌將中止處理當前集合中的重寫指令。

rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html break;

redirect: 此標誌將使用302 HTTP代碼執行臨時重定向。這主要在替換字符串不是http,或https或$scheme時使用

permanent:此標誌將使用301 HTTP代碼執行永久重定向

rewrite ^ https://www.abcgo.com$uri permanent;

7.捕獲錯誤日誌文件中的Nginx重寫命中

默認狀況下,只要Nginx成功重寫,它就不會將其記錄在error.log中。

最初在編寫複雜的重寫規則時,您確實但願確保Nginx根據您的要求進行重寫。

爲此,您應該啓用重寫日誌,該日誌將在nginx使用配置文件中的任何一個重寫指令成功重寫時隨時寫入日誌條目。

爲此,請使用rewrite_log指令並將其設置爲on。

將如下兩行添加到nginx default.conf中:

error_log /var/log/nginx/error.log notice;
rewrite_log on;

在上面:

  • 第一行指示咱們要寫入重寫消息的error_log文件的位置。請注意,重寫消息屬於類型通知。所以,您必須在此行的末尾添加「note」,如上所示。
  • rewrite_log on - 該行容許將ngx_http_rewrite_module模塊的全部指令記錄到error_log文件中。

完成上述更改後,您將開始看到這樣的行,這些行清楚地顯示了在轉換傳入URL時使用了哪些特定的重寫規則。這也將在日誌條目中顯示最終翻譯的URL。

[notice] 14385#14385: *1 "^(/data/.*)/html/(\w+)\.?.*$" matches "/data/www/html/test", client: 192.168.199.2, server: localhost, request: "GET /data/www/html/test HTTP/1.1", host: "192.168.199.20"
[notice] 14385#14385: *1 rewritten data: "/data/www/linux/test.html", args: "", client: 192.168.199.2, server: localhost, request: "GET /data/www/html/test HTTP/1.1", host: "192.168.199.20"

在上面:

  • 第1行顯示兩件事1)傳入URL 2)重寫使用的規則
  • 在第1行中,它顯示傳入的URL(即請求)。在此示例中,請求爲:「GET/data/www/html/test」
  • 在第1行中,它還顯示與此傳入請求匹配的Nginx重寫規則。在這個例子中,nginx使用的重寫規則是:「^(/data/.*)/geek/(\w+)\.?.*$」
  • 在第二行中,它顯示了應用重寫規則後Nginx使用的重寫的翻譯URL。在此示例中,翻譯的重寫URL爲:/data/www/linux/test.html
相關文章
相關標籤/搜索