2018年8月4日 星期六

IIS httpd.ini處理url有帶?加參數的情況

IIS 的轉址設定檔httpd.ini中,可以對特定的Url轉換成另一種Url,但如果要被轉的Url是有帶參數的網址,我們想把參數加在轉換後的Url後面,要如何做呢?

在這裡介紹一個可用的方法

首先例如有一下轉換設定:

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&param=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放在 ? 的後面

參考資料:

  1. ISAPI_Rewrite 2 documentation  的 "Conditional expressions" 部份
  2. Topic: Query String and IIS error msg

沒有留言 :

張貼留言