2010-03-08 37 views
0

我在我的.htaccess文件中遇到了一個非常基本的正則表達式問題,我希望有人能夠說明一些問題。基本前提是我想教Apache將任何.html擴展名切換爲.var擴展名。我曾經認爲這個規則會顯得微不足道:在RewriteRule中造成頭痛

RewriteRule ^([^.]+)\.html$ $1.var 

但是[^。]部分根本不起作用。奇怪的是,它的工作原理是這樣的

RewriteRule ^([^A-Z]+)\.html$ $1.var 

我不明白爲什麼後者的規則有效。假設我正在尋找名爲「index.html」的文件,那麼$ 1應該匹配到「索引」。和「.html」位應該實際上不匹配。

爲了擴大這個問題的範圍,我實際上正在絞盡腦汁想如何實現一個多語言網站。我不喜歡Apache的MultiView選項,因爲它強制我的平面目錄結構具有許多開發工具無法識別的文件擴展名。我可以去.var類型地圖路線,但我發現Apache的默認配置不支持這一切都好(因此我的遊覽到正則表達式土地)。所以,當我使用mod_rewrite時,我想我可能會走完整個豬圈:每當收到一個name.html文件的請求並且該文件不存在時,檢查是否存在XX/name.html文件,而不是「XX」是根據用戶喜好的語言代碼。

這會給我一個整潔的目錄結構,雖然它可能不會像.var方法那樣執行,在用戶瀏覽器的語言首選項不被我的站點支持的情況下(在這種情況下.var會取代EN或類似的)。

有什麼想法?謝謝。

回答

0

爲什麼不使用^(.*)\.html$?這將匹配以.html結尾的任何字符串。畢竟,文件名可以包含多個點。

[^A-Z]+匹配index如果應用正則表達式區分大小寫。也許這是原因?不過,爲什麼[^.]+應該會失敗。

+0

好吧,我發現我一直是一個白癡。你的回答非常正確。唉,我沒有考慮我的(無條件的)RuleRewrite的影響:一旦我將index.html變形爲index.var,Apache的類型映射就跳入了操作中,並查看index.var文件中的資源進行映射。它將DE/index.html拉出帽子。然後,Apache將DE/index.html接受另一個重寫過程,最終將該名稱改爲DE/index.var。而那個文件則不存在。不計算精彩:-))) – Ollie2893 2010-03-09 10:18:50

+0

糟糕:)好的偵探工作。 – 2010-03-09 10:41:54

0

.匹配除換行符以外的所有內容。
在字符類中,^表示「不」。
+表示一個或多個前面的字符類。

所以,當你寫([^.]+),這表示「匹配一個或多個換行符」。所以除非你有一個由換行符後跟「.html」組成的網址,否則這是行不通的。

^([^A-Z]+)\.html$因爲它匹配一個或多個字符而不是大寫字母。如果您的網址中的「.html」之前有任何大寫字母,則此問題也會失敗。

Tim Pietzcker的建議是正確的:只需使用^(.*)\.html$,請記住,在您的URL中有換行符的情況下,這不起作用。

在奇怪的情況下,你實際上有帶有換行符的URL,你可以使用^([\d\D]+)\.html$,它將匹配數字和非數字(即所有內容),直到「.html」。

+0

好的...有趣。有兩件事讓我困惑: (1)我從正則表達式的理解是,每個表達式試圖吞噬最長的匹配。那麼表達式^(。*)\。html $ function?在我看來,*應該吞下「.html」。然後爲了匹配.html,它將不得不重新回到步驟? (2)你確定「。」在角色類[]內保留你賦予的意思(我同意,它在外面有這樣的類)?如果是這樣,我也嘗試[^ \。] +沒有更多的喜悅。當然,\本應該逃避正常的意義? – Ollie2893 2010-03-08 23:27:38

+0

PS:順便說一句,「^(。*)\。html $ $ 1.var」也失敗。在您認爲我正在查看根本性失敗之前,「^(index)\。html $ $ 1.var」有效(對於target index.html)。 – Ollie2893 2010-03-08 23:37:37