在這裡介紹一個可用的方法
首先例如有一下轉換設定:
RewriteRule /url-(.*?).html /url.jsp?id=$1
可以進行例如以下url的轉換
/url-123.html ==> /url.jsp?id=123
但是如果是有帶參數的url就無法成功匹配轉換規則了
/url-123.html?param=abc ==> ???
有兩種解法,
一種是多加一條規則去處理有帶參數的情況:
RewriteRule /url-(.*?).html?(.*?) /url.jsp?id=$1&$2
這樣就可成功轉換,例如以下:
/url-123.html?param=abc ==> /url.jsp?id=123¶m=abc
但是這樣需要設定兩條規則:
RewriteRule /url-(.*?).html /url.jsp?id=$1
RewriteRule /url-(.*?).html?(.*?) /url.jsp?id=$1&$2
另一種寫法只要設定一條規則就行了,規則如下:
RewriteRule /url-(.*?).html(\?.*?)? /url.jsp(?2$2&:?)id=$1
此寫法可以做到以下url轉換:
/url-123.html ==> /url.jsp?id=123
/url-123.html?param=abc ==> /url.jsp?param=abc&id=123
接下來來講解第二種方法的原理,
其用到了類似很多程式都有的"三元運算子"規能,規則如下:
(?NtrueExpression:falseExpression)
當有抓到第N匹配群組時,執行trueExpression,沒有時則執行falseEpression,
所以
/url.jsp(?2$2&:?)id=$1
的意恩就是當有抓到2匹配群組時,執行"$2&",否則則執行"?",
而$2就是抓到的url參數部份
在這裡
/url-(.*?).html(\?.*?)?
中的(\?.*?)? 即是代表第2群組 (\?.*?) 出現的次數可為0次或1次,
所以當出現為1次時,就把抓到的參數(連同?),例如上例的 ?param=abc,
放到 /url.jsp的後面再加個 &,而id=$1就放在&的後面,
如果出現為0次時,就直接再 /url.jsp的後面加個 ? ,再把id=$1放在 ? 的後面
參考資料:
- ISAPI_Rewrite 2 documentation 的 "Conditional expressions" 部份
- Topic: Query String and IIS error msg
沒有留言 :
張貼留言