1. 程式人生 > >apache重寫帶有get引數的url地址

apache重寫帶有get引數的url地址

一,Rewrite重寫時帶“?”(問號)引數的傳遞

很多人都會遇到需要將網站以前的舊URL轉換到新版本的新URL來,但是有一些帶有引數的地址由於涉及到引數名的變更,需要通過偽靜態的方式實現跳轉。但Apache和Ngnix的方法是不支援帶引數的URL地址重寫的(即:RewriteRule不會去匹配“?”後面的字串的,需要用RewriteCond來匹配)。

例如:把 /abc?id=123 重定向到 /def.php?id=123 的寫法:
方式一:

RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^id=(.+)$
RewriteRule ^/abc$ /def.php?sid=%1
[L] **#註釋1:RewriteCond %{QUERY_STRING} ^id=(.+)$ ,得到url中的變數,並通過“%N”的方式獲取(引數名可以重寫,而且引數值可以匹配) **#註釋2:RewriteCond 裡面需要提取的值可以用 %N 進行反向引用值,而RewriteRule裡面還是需要用$N的來反向引用值****

方式二:

RewriteEngine on
RewriteBase /
RewriteRule ^/abc$ /def.php [L,QSA]

#註釋1:[QSA]表示保留重寫url時“?”後面的引數(但引數名不可以重寫,只會原樣的保留)

官方文件解釋(查詢字串):
Pattern不會按照查詢字串進行匹配。為了達到這個目的,你必須使用一個帶有% {QUERY_STRING}變數的RewriteCond指令。當然,你也可以在替換字串中建立包含查詢字串的URL:在替換字串串中使用問號,以標明其後的部分應該被重新注入到QUERY_STRING中。而要刪除一個已有的請求串,則可以用問號來終結替換字串。為了聯合新舊查詢字串,請使用[QSA]標誌。

二、apache rewrite 終結篇:apache %{QUERY_STRING}
1.$n取得第n個引數值

RewriteRule ^sss/(.*)/(.*)$ zdz/index.php?arg1=$1&arg2=$2

2.query_string(%{QUERY_STRING}後為匹配的正則)
URL引數(Query String)是URL裡面“?”後面的部分,它通常用於傳輸引數給CGI指令碼或者其它動態頁面。在Apache中,該值儲存在環境變數QUERY_STRING中(在PHP中,可以通過$_SERVER[‘QUERY_STRING’]訪問到)。
在Apache中,大多對URL進行操作的指令,如、Redirect、Alias和RewriteRule,都不能直 接訪問該資料;不過,mod_rewrite模組卻可以對URL引數進行新增、刪除和修改。其中的關鍵就是使用RewriteCond來匹配% {QUERY_STRING}變數,如果需要的話,還可以使用[QSA]標誌來附加URL引數。

eg.1
如果 http://127.0.0.1/rewrite/jeecn.zdz?par=helloforbworld 中的 query_string 包含字串forb ,則禁止訪問
RewriteCond %{QUERY_STRING} forb
RewriteRule ^(.).(.)$ preg.php?%{QUERY_STRING} [F]

eg.2
通過[QSA]標誌保留原有URL引數的同時,在後面增加新的URL引數:param=value
RewriteRule ^/page /page?param=value [QSA]

eg4.%n反向引用
1)當訪問 /path 時,將字串 parm修改為 showparm
RewriteCond %{QUERY_STRING} ^(.)parm(.)$
RewriteRule /path /path?%1showparm%2
上面的%1和%2是反向引用,來自之前的RewriteCond中正則表示式的匹配結果