2009-03-02 77 views
5

沒有結束,我想在使用國防部重寫轉換網頁地址一樣/目錄/directory/index.html,在一個標準的LAMP託管情況。我所用的地址以斜線結尾。我無法找到處理地址的方法,這些地址不會以斜槓結束。RewriteEngine敘述在.htaccess趕上文件HTML

什麼似乎像它應該工作是:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in/*/ 
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */ 

但第二行導致500服務器錯誤。如果我加一個字母X到第二行:

rewriterule ^(.*)/$ $1/index.html [L] 
rewriterule ^(.*x(?!html))$ $1/index.html [L] 

它開始工作,但僅適用於在X結束目錄名。我曾嘗試用許多不同的東西替換x。任何比真實字符更復雜的東西(如[^ x]或。+)都會導致500服務器錯誤。

而且,爲了滿足我自己的好奇心,有誰知道爲什麼添加一個真實的字母會導致服務器錯誤和完美運行規則之間的區別?

[接受的答案]由於甘博我能近似使用的RewriteCond的解決方案:

 
rewritecond %{REQUEST_URI} !\.[^/]+$ 
rewriterule (.+) $1/index.html [L] 

這工作,但過濾器不僅僅是html的 - 它可以阻止其他頁面。不幸的是,

rewritecond %{REQUEST_URI} !\.html$ 

導致服務器錯誤:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

我還是想知道爲什麼:

rewriterule ^(.*(?!html))$ $1/index.html [L] 

結果在一個循環。上半部分應該檢查是否不是以.html結尾。自去年下半年以來增加的.html,好像在功能上等同:

 
while(substr($address,-4)!='html') $address.='html' 

很顯然,我失去了一些東西。

+0

如果您可以命名服務器錯誤,它會更有幫助。 – Gumbo 2009-03-03 09:55:42

+0

你沒看過我的編輯筆記嗎?前瞻斷言看起來錯誤的方向。 – Gumbo 2009-03-10 16:25:26

回答

6

使用RewriteCond指令來檢查是否網址路徑不以.html結束。但.*(僅限於$)後沒有任何內容。因此,嘗試看看,後面的斷言,而不是:

RewriteRule ^.*$(?<!html) $0/index.html [L] 

但請注意,你可能需要Apache 2.2使用這些說法。

1

嗯,實際上使其工作,你可以只使用負回顧後,而不是一個前瞻:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L] 

我不知道爲什麼隨便加入「X」使得它的工作,我會編輯,如果我弄明白了。

+0

這個建議創建了與我原來的建議相同的500服務器錯誤 - 並且它只在我添加了一個隨機字母之前(?。 – 2009-03-03 07:57:07

1

爲什麼添加x使它工作: 如果替換將與正則表達式匹配,則將重新應用RewriteRule。作爲一個例子,這將導致一個錯誤:

RewriteRule ^(.*)$ $1.rb 

,因爲它會與script.rb取代script。這與正則表達式匹配,所以它會一次又一次地用script.rb.rb取代script.rb ...

這暗示在錯誤日誌:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. 

在你的榜樣,你添加的index.html到最後。如果在正則表達式的末尾有x,那麼它將不匹配您的替換,它以l結尾。您使用先行斷言((?!…)

RewriteCond %{REQUEST_URI} !\.html$ 
RewriteRule ^(.*[^/])?/?$ $1/index.html [L] 

編輯:

+0

它不應該在andrew提供的樣本中作爲[L] – 2009-03-02 21:59:01

相關問題