Rewrite是一種伺服器的重寫脈衝技術,它可以使得伺服器可以支援 URL 重寫,是一種流行的伺服器技術。它還可以實現限制特定IP訪問網站的功能。很多情況下,某個 IP 的訪問很容易造成 CPU 100% (比如 某些搜尋引擎的固定抓取,別人大量的採集網站),這個時候我們就要利用一些有效手段封掉對方的 IP,讓他無法消耗伺服器的資源,封 IP 的方法有很多種,如果你的 Web(Nginx|Apache|other) 伺服器安裝了 Rewrite 模組的話,也可以試試利用 Rewrite 規則封掉對方的 IP。 –摘自BaiDu百科
最近工作中遇到這樣一件事,有一個webserveice 從JAVA轉變成PHP,程式面的原因導致介面的名字變了,這裡就需要使用偽靜態讓請求介面的請求能正常處理,首先先看下rewrite的指令:
1、set:
用於設定變數
2、if:
if用於判斷一些在rewrite語句中無法直接匹配的條件,如檢測檔案是否存在以及http、header、cookie
###當if運算式中的條件為true,則執行if塊中的語句###
###當運算式只是一個變數時,如果值為空白或者任何以0開頭的字串都會當作false###
###直接比較內容時,使用 = 和 !=###
正則規則:
~ #區分大小寫字母的匹配#
~* #不區分大小寫匹配#
!~ #! 等同 find ! -name "True",表示不匹配#
!~* #同上#
-f 判斷檔案存在
-d 判斷目錄存在
-e 判斷檔案,目錄或者符號連結存在
-x 判斷檔案可執行
Example:
###如果User-Agent包含MSIE 則rewrite到/msie/目錄###
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
###如果檔案名稱不存在,返回444(沒人會這麼用哦)
if (!-e $request_filename) {
return 444;
###常規做法都會rewrite 到指定頁面###
}
關於return指令
文法: return code
範圍: server,location,if
參考:
1xx(臨時響應)
表示臨時響應並需要要求者繼續執行操作的狀態碼。
代碼 說明
100 (繼續) 要求者應當繼續提出請求。 伺服器返回此代碼錶示已收到請求的第一部分,正在等待其餘部分。
101 (切換協議) 要求者已要求伺服器切換協議,伺服器已確認並準備切換。
2xx (成功)
表示成功處理了請求的狀態碼。
代碼 說明
200 (成功) 伺服器已成功處理了請求。 通常,這表示伺服器提供了請求的網頁。
201 (已建立) 請求成功並且伺服器建立了新的資源。
202 (已接受) 伺服器已接受請求,但尚未處理。
203 (非授權資訊) 伺服器已成功處理了請求,但返回的資訊可能來自另一來源。
204 (無內容) 伺服器成功處理了請求,但沒有返回任何內容。
205 (重設內容) 伺服器成功處理了請求,但沒有返回任何內容。
206 (部分內容) 伺服器成功處理了部分 GET 請求。
3xx (重新導向)
表示要完成請求,需要進一步操作。 通常,這些狀態碼用來重新導向。
代碼 說明
300 (多種選擇) 針對請求,伺服器可執行多種操作。 伺服器可根據要求者 (user agent) 選擇一項操作,或提供巨集指令清單供要求者選擇。
301 (永久移動) 請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將要求者轉到新位置。
302 (臨時移動) 伺服器目前從不同位置的網頁響應請求,但要求者應繼續使用原有位置來進行以後的請求。
303 (查看其他位置) 要求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此代碼。
304 (未修改) 自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
305 (使用代理) 要求者只能使用代理訪問請求的網頁。 如果伺服器返回此響應,還表示要求者應使用代理。
307 (臨時重新導向) 伺服器目前從不同位置的網頁響應請求,但要求者應繼續使用原有位置來進行以後的請求。
4xx(請求錯誤)
這些狀態碼表示請求可能出錯,妨礙了伺服器的處理。
代碼 說明
400 (錯誤請求) 伺服器不理解請求的文法。
401 (未授權) 請求要求身分識別驗證。 對於需要登入的網頁,伺服器可能返回此響應。
403 (禁止) 伺服器拒絕請求。
404 (未找到) 伺服器找不到請求的網頁。
405 (方法禁用) 禁用請求中指定的方法。
406 (不接受) 無法使用請求的內容特性響應請求的網頁。
407 (需要代理授權) 此狀態碼與 401(未授權)類似,但指定要求者應當授權使用代理。
408 (請求逾時) 伺服器等候請求時發生逾時。
409 (衝突) 伺服器在完成請求時發生衝突。 伺服器必須在響應中包含有關衝突的資訊。
410 (已刪除) 如果請求的資源已永久刪除,伺服器就會返回此響應。
411 (需要有效長度) 伺服器不接受不含有效內容長度標題欄位的請求。
412 (未滿足前提條件) 伺服器未滿足要求者在請求中設定的其中一個前提條件。
413 (請求實體過大) 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。
414 (請求的 URI 過長) 請求的 URI(通常為網址)過長,伺服器無法處理。
415 (不支援的媒體類型) 請求的格式不受請求頁面的支援。
416 (請求範圍不符合要求) 如果頁面無法提供請求的範圍,則伺服器會返回此狀態碼。
417 (未滿足期望值) 伺服器未滿足"期望"請求標題欄位的要求。
444 (非標準HTTP狀態代碼)以不發送任何Header頭的方式結束串連。
5xx(伺服器錯誤)
這些狀態碼表示伺服器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是伺服器本身的錯誤,而不是請求出錯。
代碼 說明
500 (伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。
501 (尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別要求方法時可能會返回此代碼。
502 (錯誤網關) 伺服器作為網關或代理,從上遊伺服器收到無效響應。
503 (服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這隻是暫時狀態。
504 (網關逾時) 伺服器作為網關或代理,但是沒有及時從上遊伺服器收到請求。
505 (HTTP 版本不受支援) 伺服器不支援要求中所用的 HTTP 協議版本。
rewrite 標誌位:
###Nginx URL rewrite後仍會進行rewrite檢查,最多重試10次,如果10次仍未終止則會返回HTTP CODE 500###
break : 停止rewrite檢測,也就是說當含有break flag的rewrite語句被執行時,該語句就是rewrite的最終結果
last : 停止rewrite檢測,但是跟break有本質的不同,last的語句不一定是最終結果,這點後面會跟nginx的location匹配一起提到
redirect : 返回302臨時重新導向,一般用於重新導向到完整的URL(包含http:部分)
permanent : 返回301永久重新導向,一般用於重新導向到完整的URL(包含http:部分)
Example:
###Rewrite Rules###
rewrite /test.php /last.php last;
rewrite /301.php /permanent.php permanent;
[root@Nginx-one www.111cn.net]# curl -I 1.1.1.10/test.php
HTTP/1.1 200 OK
Server: nginx/1.6.0
Date: Sun, 07 Sep 2014 01:05:32 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.13
[root@Nginx-one www.111cn.net]# curl -I 1.1.1.10/301.php
HTTP/1.1 301 Moved Permanently
Server: nginx/1.6.0
Date: Sun, 07 Sep 2014 01:05:35 GMT
Content-Type: text/html
Content-Length: 184
Location: http://1.1.1.10/permanent.php
Connection: keep-alive