Apache-2.2

Apache重寫規則和特殊字元

  • February 6, 2014

我有一個伺服器,其中一些文件的名稱中有實際 %20名稱(它們是由以這種方式處理空格的自動化工俱生成的,對此我無能為力);這不是空格:它是“%”,然後是“2”,然後是“0”。

在此伺服器上,有一個 Apache Web 伺服器,並且有一些網頁連結到這些文件,在 URL 中使用它們的名稱,例如http://servername/file%20with%20a%20name%20like%20this.html;這些頁面也是由同一個工俱生成的,所以我(再次!)對此無能為力。在這裡,對所有文件、頁面和 URL 進行完整的搜尋和替換是不可能的。

問題:當使用上述 URL 呼叫 Apache 時,它(正確地)將 “%20” 轉換為空格,然後它當然找不到文件,因為它們沒有實際的空格他們的名字。

我該如何解決這個問題?

我發現使用類似的 URLhttp://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”;但是,出於好奇:有沒有辦法讓這個工作與任意數量的空間一起工作?如果用普通字元替換任意數量的空格,則它適用於第一條規則,此問題僅在涉及特殊字元時發生。

% 被讀取為反向引用,因此您需要轉義 %。

引用自:https://serverfault.com/questions/143768