2012-04-12 62 views
1

在我嘗試使用.htaccess重定向的其中一個項目中。我使用這樣的重定向:.htaccess重定向,但有異常

RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

但是,現在我想添加一個例外的重寫規則。我想要http://example.com/admin/以同樣的方式重定向到只有不同的目錄。所有其他流量仍應該進入公共目錄。所以我增加了這樣一個重寫條件:

RewriteCond %{REQUEST_URI} !/admin/ 
RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

這沒有辦法。我仍然被重定向到公共文件夾。我也試過這個:

RewriteRule ^admin$ admin/ [L] 
RewriteRule admin(.*) admin/$1 [L] 

RewriteCond %{REQUEST_URI} !/admin 
RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

這隻會讓事情變得更糟。我現在得到一個500內部服務器錯誤。

我一直在尋找幾個小時,我有點厭倦了找到示例,說明如何爲某個文件夾添加例外,但不顯示如何將此流量重定向到另一個文件夾。你能告訴我我做錯了什麼,或者我可以嘗試哪些其他方法?

回答

5

A RewriteCond僅適用於直接在它下面的規則。換句話說,在你的例子中,它只適用於空路徑規則。將RewriteCond向下移動一個檔位,效果會更好。

RewriteRule ^$ public/ [L] 

RewriteCond %{REQUEST_URI} !/admin/ 
RewriteRule (.*) public/$1 [L] 

此外,我發現您的規則

RewriteRule admin(.*) admin/$1 [L] 

應爲奇數。像/adminsomething這樣的URL將被重寫爲/admin/something,我認爲這不是你想要的。

此外,我有一個預感,你很困惑重寫重定向。重寫是一種規則,可以使請求在內部重寫並進行不同的解釋。重定向是一條規則,它會告訴訪問者的瀏覽器轉到不同的地址。你要去哪一個?

重定向的magic關鍵字爲R=301,這意味着重定向時使用http代碼301永久移動。例如,你可能想嘗試...

# This first rule is actually redundant in this case so skip it... 
#RewriteRule ^$ public/ [R=301,L] 
RewriteCond %{REQUEST_URI} !/admin 
RewriteRule (.*) public/$1 [R=301,L] 
+0

管理員的事情只是一個錯字。我忘了斜線。我把RewriteCond移到了一條規則,一切都按照我的意願工作。我想我正在尋找一個重寫規則,因爲它應該在內部處理。 – 2012-04-12 14:40:07