ewrite模塊介紹
nginx的重寫模塊是一個簡單的正則表達式匹配與一個虛擬堆疊機結合。依賴于PCRE庫,因此需要安裝pcre。根據相關變量重定向和選擇不同的配置,從一個location跳轉到另一個location,不過這樣的循環最多可以執行10次,超過后nginx將返回500錯誤。同時,重寫模塊包含set指令,來創建新的變量并設其值,這在有些情景下非常有用的,如記錄條件標識、傳遞參數到其他location、記錄做了什么等等。
rewrite模塊指令
break
語法:break
默認值:none
使用字段:server, location, if
作用:完成當前設置的重寫規則,停止執行其他的重寫規則。
if
語法:if (condition) { … }
默認值:none
使用字段:server, location
注意:盡量考慮使用trp_files代替。
判斷的條件可以有以下值:
一個變量的名稱:空字符傳”“或者一些“0”開始的字符串為false。
字符串比較:使用=或!=運算符
正則表達式匹配:使用~(區分大小寫)和~(不區分大小寫),取反運算!~ 和!~。
文件是否存在:使用-f和!-f操作符
目錄是否存在:使用-d和!-d操作符
文件、目錄、符號鏈接是否存在:使用-e和!-e操作符
文件是否可執行:使用-x和!-x操作符
return
語法:return code
默認值:none
使用字段:server, location, if
停止處理并為客戶端返回狀態碼。非標準的444狀態碼將關閉連接,不發送任何響應頭。可以使用的狀態碼有:204,400,402-406,408,410, 411, 413, 416與500-504。如果狀態碼附帶文字段落,該文本將被放置在響應主體。相反,如果狀態碼后面是一個URL,該URL將成為location頭補值。沒有狀態碼的URL將被視為一個302狀態碼。
rewrite
語法:rewrite regex replacement flag
默認值:none
使用字段:server, location, if
按照相關的正則表達式與字符串修改URI,指令按照在配置文件中出現的順序執行。可以在重寫指令后面添加標記。
注意:如果替換的字符串以http://開頭,請求將被重定向,并且不再執行多余的rewrite指令。
尾部的標記(flag)可以是以下的值:
last – 停止處理重寫模塊指令,之后搜索location與更改后的URI匹配。
break – 完成重寫指令。
redirect – 返回302臨時重定向,如果替換字段用http://開頭則被使用。
permanent – 返回301永久重定向。
rewrite_log
語法:rewrite_log on | off
默認值:rewrite_log off
使用字段:server, location, if
變量:無
啟用時將在error log中記錄notice級別的重寫日志。
set
語法:set variable value
默認值:none
使用字段:server, location, if
為給定的變量設置一個特定值。
uninitialized_variable_warn
語法:uninitialized_variable_warn on|off
默認值:uninitialized_variable_warn on
使用字段:http, server, location, if
控制是否記錄未初始化變量的警告信息。
重寫規則組成部分
第一部分–正則表達式
可以使用括號來捕獲,后續可以根據位置來將其引用,位置變量值取決于捕獲正則表達式中的順序,引用第一個括號中的值,引用第二個括號中的值,以此類推。如:
^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$
# 是兩個小寫字母組成的字符串
# 是由小寫字母和0到9的數字組成的5個字符的字符串
# 將是個文件名
# 是png、jpg、gif中的其中一個。
第二部分–URI
請求被改寫。該URI可能包含正則表達式中的捕獲的位置參數或這個級別下的nginx任何配置變量。如:
/data?file=.
如果這個URI不匹配nginx配置的任何location,那么將給客戶端返回301(永久重定向)或302(臨時重定向)的狀態碼來表示重定向類型。該狀態碼可以通過第三個參數來明確指定。
第三部分–標記
第三部分也就是尾部的標記(flag)。 last標記將導致重寫后的URI搜索匹配nginx的其他location,最多可循環10次。如:
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=. last;
break指令可以當做自身指令。如:
if ($bwhog) {
limit_rate 300k;
break;
}
ginx 的 rewrite 語法
語法: rewrite regex replacement flag
默認: none
作用域: server, location, if
此指令根據表達式來更改URI,或修改字符串。
指令根據配置文件中的順序來執行。
注意:
重寫表達式只對相對路徑有效。如果想配對主機名,應該使用if語句。
rewrite只是會改寫路徑部分的東東,不會改動用戶的輸入參數,因此這里的if規則里面,你無需關心用戶在瀏覽器里輸入的參數,rewrite后會自動添加的,因此,只是加上了一個?號和后面我們想要的一個小小的參數 ***https=1就可以了。
nginx的rewrite規則參考:
~ 為區分大小寫匹配
~* 為不區分大小寫匹配
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行
last 相當于Apache里的[L]標記,表示完成rewrite,呵呵這應該是最常用的
break 終止匹配, 不再匹配后面的規則
redirect 返回302臨時重定向 地址欄會顯示跳轉后的地址
permanent 返回301永久重定向 地址欄會顯示跳轉后的地址
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
結合QeePHP的例子:
復制代碼代碼示例:
if (!-d $request_filename) {
rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=&action=& last;
rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller= last;
break;
多目錄轉成參數
復制代碼代碼示例:
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
if ($host ~* (.*)\.domain\.com) {
set $sub_name ;
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id= last;
}
認IIS是不提供URL重寫模塊的。請注意,不要將IIS默認的HTTP重定向理解為url重寫。
url重寫,是要從iis的應用市場下載url重寫組件才可以的。
URL重寫工具的下載地址: 64位版本 32位版本
比如我樣實現訪問www.demo.com/1.aspx自動跳到新地址www.demo.com/1
規則設置如下:
如下圖:
代碼:
<system.webServer> <rewrite> <rules> <rule name="test" stopProcessing="true"> <match url="shop/(.*).aspx" /> <action type="Redirect" url="/shop/{R:1}" /> <conditions> </conditions> </rule> </rules> </rewrite> </system.webServer>
那如果要加動態頁面怎么辦???莫慌,莫慌,看下圖:原鏈接:http://en.amusechina.cn/en/ProductDetail-2.0.aspx?proId=1159&cateId=99現鏈接:http://en.amusechina.cn/product1159/99.html
填寫內容 ->
名稱:隨意
模式:(.*) ;代表全部,任意,無論是否字符都匹配
條件:{HTTPS};https,模式^OFF$,代表https關閉,也就是沒有;;;{HTTP_HOST}:填寫要匹配的域名,不能其他的域名訪問到也重定向至這個https,邏輯分組全部匹配,任意匹配是滿足一個條件即可進行下面處理
操作類型:重定向
重定向URL:https://www.example.com/{R:1}
結果相當于 訪問 http://www.example.com/……. 重定向至 https://www.example.com/…….
模式:^blog/(.*)
類型:重寫
目標URL:http://127.0.0.1:3001/{R:1}
結果:訪問:http://www.example.com/blog/index.html —> http://127.0.0.1:3001/inde.html
當然這個127.0.0.1指的是服務器的本地,而不是訪問者電腦本地,這樣使用,可以防止開發太多端口,引起安全問題
模式:(.*)phpf$:代表訪問的文件以phpf結尾
類型:重寫
目標URL:http://www.example.com/{R:1}.php
結果:訪問:http://www.example.com/dir/loginphpf —> http://www.example.com/dir/login.php
這樣當后端有其他語言或者不想在前端顯示文件后綴時,可以使用這種方式來進行隱藏,phpf可以自己隨意更改
*請認真填寫需求信息,我們會在24小時內與您取得聯系。