2011-02-12 97 views
1

我有兩個類型的網址:我是用這個.htaccess的URL重寫多個URL重寫規則(Pretify)

http://mydomain.com/npguar/en/products.php
http://mydomain.com/npguar/en/1/product_specification.php

早些時候:

RewriteEngine on 
RewriteCond $1 !^(index\.php|assets|robots\.txt) 
RewriteRule ^([a-z]{2})/(.*) $2?language=$1 [L] 

再後來我修改它對此,但它似乎並不工作

RewriteEngine on 

RewriteCond $1 ^(product_specification\.php) 
RewriteRule ^([a-z]{2})/([0-9]{1,2})(.*) $3?language=$1&id=$2 [L] 

RewriteCond $1 !^(index\.php|assets|robots\.txt|product_specification\.php) 
RewriteRule ^([a-z]{2})/(.*) $2?language=$1 [L] 

回答

2

原始規則的工作原理如下。開始用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] 
+0

謝謝,它的工作,但你能解釋我的查詢實際上是錯誤的嗎? – Shishant 2011-02-12 18:22:43