2012-07-14 39 views
1

我在.htaccess文件有這個RerwiteRule遷移網站代碼停留在同一個域

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

我所試圖做的是添加其他重寫規則,以這種配置,使舊網址像這樣將被重定向到網站的根目錄

http://www.acme.com/category.php?id=6 
http://www.acme.com/product.php?id=183&category= 

我知道「category.php」和「product.php」現在是一個無效的字符串。使用「category.php」作爲一個例子,我試圖改變配置成爲這個

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^category.php(.*)/[L,R=301] 
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

這將重定向如下

http://www.acme.com/category.php?id=112 -> http://www.acme.com/?id=112 

我有兩個問題

  1. 我不希望追加查詢字符串。我沒有指定 [QSA]
  2. 如果我直接輸入根目錄www.acme.com,則頁面將不會顯示 ,除非我刪除剛添加的行。爲什麼我的新RewriteRule 會影響不以「category.php」開頭的URL?

[編輯]

我也試過這個,而不是上面的重定向,但我仍然似乎正在被應用

RewriteRule ^category.php /holdingPage.php [L] 

回答

1

兩個規則需要2個條件被綁定到通過index.php發送所有內容的舊規則,並且您需要添加新規則以上他們:

RewriteEngine On 
RewriteBase/

RewriteRule ^category.php /? [L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

要處理1.,我添加了一個「「在規則目標中的/末尾,這使得查詢字符串不會自動追加,除非您專門具有QSA標誌。 ,但它可能有一些東西需要做,正在應用到錯誤的規則2個條件


編輯:

對於2條RewriteCond線的描述,看到這個帖子:https://stackoverflow.com/a/11275339/851273

A RewriteCond本質上是一個條件,該塊:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

基本上是這樣(在僞代碼):

if(request_uri != maps_to_existing file) { 
    if(request_uri != maps_to_existing_directory) { 
     request_uri = request_uri.replace("([^?]*)", "index.php?_route_=$1", "[L,QSA]"); 
    } 
} 

的事情是,一個RewriteCond,或之後直接在另一許多它們中的一個,只適用到緊接着的RewriteRule,所以不用移動類別。PHP排除在前,pseudoc DEO相當於本來:

if(request_uri != maps_to_existing file) { 
    if(request_uri != maps_to_existing_directory) { 
     request_uri = request_uri.replace("^category.php", "/?", "[L,R=301]"); 
    } 
} 
request_uri = request_uri.replace("([^?]*)", "index.php?_route_=$1", "[L,QSA]"); 

這是一種打破,因爲在2個if()條件語句被錯誤使用。具體來說,重寫爲「index.php」的那種需要條件以防止自身循環。

+0

謝謝喬恩,那就是訣竅。然而,你能解釋一下爲什麼把RewriteRule移動到RewriteCond上的行爲有所不同嗎?我認爲RewriteCond只是匹配「文件」和「目錄」的請求 – Brad 2012-07-17 13:39:59

+0

@Brad是啊,請參閱上面的編輯 – 2012-07-17 15:15:35

+0

謝謝喬恩。我很感激你花時間來解釋。 – Brad 2012-07-18 11:38:51