rewrite可以根據您的條件將傳入的URL更改(重寫)到不一樣的URL是任何Web服務器的基本功能。php
Nginx重寫功能很是強大且靈活。html
咱們將在nginx重寫中解釋如下示例:linux
如下是nginx重寫的語法:nginx
rewrite reg-ex replacement [flag];
在上面:正則表達式
在nginx中,能夠在如下三個上下文中的任何一個內指定rewrite指令:server,location,ifcentos
如下是Nginx重寫指令的示例:瀏覽器
rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html last;
例如:服務器
在上面的重寫規則中:ide
雖然Nginx重寫規則與Apache相似,但在如何在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,以下所示:
與前面的示例相似,咱們在替換字符串中使用$1來捕獲reg-ex中第一個括號()內的任何內容。在這種狀況下,這是原始傳入URL的最後一部分。
咱們還使用此處的最後一個標誌來指示nginx中止在當前塊中搜索進一步的重寫指令,並繼續移動到下一個匹配位置以進行進一步搜索。
在這個例子中,咱們將重寫條件放在location指令中。
在此示例中,location指令是/data/,它還匹配下面給出的替換字符串中的$1。
location /data/ { rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html break; return 403; }
若是你使用上面的「最後」標誌會發生這種狀況:
由於,咱們不但願出現上述行爲,咱們在這裏使用了「break」做爲標誌,它將再次中止處理重寫塊。
要在位置上下文中有效使用重寫指令,您須要瞭解位置如何工做的詳細信息
若是替換字符串包含新請求參數,則先前的請求參數將附加在它們以後。若是您不想要此行爲,請在替換字符串的末尾添加問號,以免添加它們。
在如下示例中,在替換字符串部分中,末尾沒有問號。即$1後無問號
rewrite ^/linux/(.*)$ /linux.php?www=$1 last;
在上面的示例中,當替換字符串包含傳入的請求參數時,以前請求的參數將附加在它們以後。
有時候,你可能不但願這種狀況發生。在那種狀況下,使用?以下所示。
在下面的例子中,在Nginx重寫的替換字符串部分中,咱們添加了?在末尾。即$1後有一個問號
rewrite ^/linux/(.*)$ /linux.php?www=$1? last;
在上面的示例中,替換字符串包含傳入的請求參數,而後不會在它們以後附加前一個請求的參數。
如下幾個示例說明咱們能夠在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
如下是您可使用的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;
默認狀況下,只要Nginx成功重寫,它就不會將其記錄在error.log中。
最初在編寫複雜的重寫規則時,您確實但願確保Nginx根據您的要求進行重寫。
爲此,您應該啓用重寫日誌,該日誌將在nginx使用配置文件中的任何一個重寫指令成功重寫時隨時寫入日誌條目。
爲此,請使用rewrite_log指令並將其設置爲on。
將如下兩行添加到nginx default.conf中:
error_log /var/log/nginx/error.log notice; rewrite_log on;
在上面:
完成上述更改後,您將開始看到這樣的行,這些行清楚地顯示了在轉換傳入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"
在上面:
「^(/data/.*)/geek/(\w+)\.?.*$」
/data/www/linux/test.html