原始規則的工作原理如下。開始用URL:
http://mydomain.com/npguar/en/index.php?maybe=a-query
只拿文件系統路徑:
npguar/en/index.php
除去用於獲取到.htaccess
前綴:
en/index.php
匹配這對正則表達式^([a-z]{2})/(.*)
。它匹配,所以處理繼續。有子模式的正則表達式,它匹配這樣的URL的一部分:
(en)/(index.php)
這場比賽定義了反向引用$1 = en
和$2 = index.php
。
現在檢查相應的RewriteCond
。第一個參數是$1
,它擴展爲字符串en
。第二個參數是!
,以及與該字符串不匹配的正則表達式,因此條件爲真。
由於條件爲真,回到RewriteRule
和構建替換字符串$2?language=$1
:
index.php?language=en
這是一個內部重定向,這樣就把一部開拓創新的URL的位重新走到一起。由於此處存在查詢並且未指定[QSA]
標誌,因此將替換原始查詢(maybe=a-query
)。
http://mydomain.com/npguar/index.php?language=en
該URL從一開始就交給Apache進行處理。再次檢查重寫規則([L]
標誌不會阻止此操作),但它們不匹配,並且提供頁面。
這個規則的問題是在RewriteCond
的$1
。它應該是$2
。那麼在上面的例子中RewriteCond
將是錯誤的,但在en/products.php
中是正確的。
雖然這工作正常,因爲RewriteCond
只是比你想的更鬆。
新規則不起作用,因爲正則表達式打破了這樣一個URL(注意:其中第二/
雲):
(en)/(1)(/product_specification.php)
所以$1 = en
,$2 = 1
,。然後它將$1
與^product_specification.php
進行比較,它不匹配,並且條件爲假。
相反,新的規則應該是:
RewriteCond $3 ^product_specification\.php$
^^ ^
RewriteRule ^([a-z]{2})/([0-9]{1,2})/(.*) $3?language=$1&id=$2 [L]
^
(我也是在結尾添加一個$
使.../product_specification.phpfoo
不匹配。)
同樣的規則可以是簡單的:
RewriteRule ^([a-z]{2})/([0-9]{1,2})/(product_specification\.php)$ $3?language=$1&id=$2 [L]
來源
2011-02-12 17:43:43
aaz
謝謝,它的工作,但你能解釋我的查詢實際上是錯誤的嗎? – Shishant 2011-02-12 18:22:43