2014-11-05 52 views
1

在我的.htacccess文件中,我有兩個重寫規則,但無法正常工作。下面是代碼:如何防止多個子域重寫規則出現500錯誤?

RewriteCond %{HTTP_HOST} ^admin.example.com [NC] 
#RewriteRule ^administration/ - [L] 
RewriteRule (.*) administration/$1 [L] 

RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

上面的代碼的結果是:

  • admin.example.com - 500內部服務器錯誤
  • example.com - 做工精細

但如果我取消註釋第二行並運行RewriteRule ^administration/ - [L],結果爲:

  • admin.example.com - 做工精細
  • example.com - 500內部服務器錯誤

實際上,我不知道什麼第二行實際上做的事情。我不擅長htaccess重寫編碼。我從another question here on Stackoverflow發現那一行。

關於500錯誤,我認爲它是由無限循環造成的。但不能真正看到它的代碼如何顯示。所以真的想得到解釋。

所以,我真的很想得到答案的是:

  1. 是什麼線2點的手段,特別是「 - 」字呢?
  2. 什麼導致500錯誤?

回答

1

500可能是由於無限循環,請嘗試以下規則:

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [NE,L,R=301] 

RewriteCond %{HTTP_HOST} =admin.example.com [NC] 
RewriteRule ^((?!administration/).*)$ administration/$1 [L,NC] 
+0

這解決了這個問題。十分感謝。如果你想解釋什麼導致了循環和你做了什麼,它真的很感激。不過謝謝。 – 2014-11-05 21:41:48

+0

問題出在這個規則:'RewriteRule(。*)administration/$ 1 [L]'因爲它無條件地將每個請求路由到'/ administration',並且mod_rewrite一直運行,因爲這個規則並沒有停止重寫。在我的答案中使用負向lookahead正則表達式後,它會在第一次重寫後停止。 – anubhava 2014-11-05 21:47:59

+0

好吧,現在這導致了一個新問題,這也許應該是它自己的問題。但我在管理中有一個相同的htaccess文件副本(我記得其實名爲「test」)。這導致了一個新的無限循環。我這次明白了爲什麼,但無法弄清楚如何避免。我想保留兩個文件中完全相同的代碼。是否有可能檢查你所在的目錄? – 2014-11-06 09:24:12