Apache重寫規則和特殊字元
我有一個伺服器,其中一些文件的名稱中有實際
%20
名稱(它們是由以這種方式處理空格的自動化工俱生成的,對此我無能為力);這不是空格:它是“%”,然後是“2”,然後是“0”。在此伺服器上,有一個 Apache Web 伺服器,並且有一些網頁連結到這些文件,在 URL 中使用它們的名稱,例如
http://servername/file%20with%20a%20name%20like%20this.html
;這些頁面也是由同一個工俱生成的,所以我(再次!)對此無能為力。在這裡,對所有文件、頁面和 URL 進行完整的搜尋和替換是不可能的。問題:當使用上述 URL 呼叫 Apache 時,它(正確地)將 “%20” 轉換為空格,然後它當然找不到文件,因為它們沒有實際的空格他們的名字。
我該如何解決這個問題?
我發現使用類似的 URL
http://servername/file%2520name.html
效果很好,因為 Apache 將“%25”轉換為“%”符號,從而建構了正確的文件名。我嘗試使用 Apache 重寫規則,我可以成功地用連字元替換空格,語法如下:
RewriteRule (.*)\ (.*) $1-$2
問題:當我嘗試用“%2520”序列替換它們時,這不會發生。如果我使用
RewriteRule (.*)\ (.*) $1%2520$2
然後生成的 URL 是
http://servername/file520name.html
;我也試過“%25”,但我只得到一個“5”;看起來最初的“%2”有點被丟棄了。問題:
- 如何建構這樣的正則表達式來用“%2520”替換空格?
- 這是我可以處理這個問題的唯一方法(除了完整的搜尋和替換,正如我所說的那樣,無法完成),還是你有更好的主意?
編輯:
轉義是關鍵,它使用以下規則起作用:
RewriteRule (.*)\ (.*) $1\%2520$2
但它只有在初始 URL 中有一個“%20”時才有效;如果有多個,我會收到“內部伺服器錯誤”。
看起來我快到了……請幫助:-)
編輯2:
使用以下規則,我能夠讓它在兩個空間中工作:
RewriteRule (.*)\ (.*)\ (.*) $1\%2520$2\%2520$3
這足以滿足我的需要,因為該工俱生成的 URL 最多只能包含兩個“%20”;但是,出於好奇:有沒有辦法讓這個工作與任意數量的空間一起工作?如果用普通字元替換任意數量的空格,則它適用於第一條規則,此問題僅在涉及特殊字元時發生。
% 被讀取為反向引用,因此您需要轉義 %。