Rewrite是一種服務器的重寫脈沖技術,它可以使得服務器可以支持 URL 重寫,是一種流行的服務器技術。它還可以實現限制特定IP訪問網站的功能,很多情況下,某個 IP 的訪問很容易造成 CPU 100%,比如 某些搜索引擎的固定抓取,別人大量的采集站點,這個時候我們就要利用一些有效的手段封掉對方的 IP,讓他無法消耗服務器的資源,封 IP 的方法有很多種,如果你的 Web(Nginx|Apache|other,服務器安裝了 Rewrite 模塊的話,也可以試試利用 Rewrite 規則封掉對方的 IP.
最近工作中遇到這樣一件事,有一個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 m.survivalescaperooms.com]# 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 m.survivalescaperooms.com]# 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
新聞熱點
疑難解答