Virtualhost

帶有包含空格的 URL 的 Apache RewriteMap 不起作用

  • April 25, 2019

我實際上RewriteMap在我的虛擬主機中使用了一個指令來重定向 800 個 URL 的列表。它執行良好:

RewriteEngine On
RewriteMap redirects dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

我使用redirect.txt包含映射的文件。然後將其轉換為 db 文件:

httxt2dbm -f db -i /data/apps/project/current/configuration/etc/httpd/conf/redirects.txt -o /data/apps/project/current/configuration/etc/httpd/conf/redirects.db

例如對於這種 URL,就可以了:

/associations/old_index.php /

但是當 URL 包含空格時它不起作用:(我想它與其他特殊字元相同)

/Universités%20direct   /

如何處理這種情況?

一種解決方法可能是在內部將包含空格的 URL 重寫為連字元(用連字元替換空格),並將連字元的 URL 包含在重寫映射中。

如果您只有一些在 URL 中包含單個空格的 URL,那麼您可以在現有指令之前使用類似於以下指令的內容:

RewriteRule ^(.+)\s(.+)$ $1-$2

然後在重寫映射中使用以下內容:

/Universités-direct /

**更新:**如果您的 URL 包含兩個空格(例如。/the force awakens)和一些包含一個空格的 URL,那麼您可以添加一個附加規則:

RewriteRule ^(.+)\s(.+)\s(.+)$ $1-$2
RewriteRule ^(.+)\s(.+)$ $1-$2

這些規則確實假定您沒有以空格結尾的 URL。並且沒有一個 URL 有超過一個連續的空間。

如果三個空格然後在上面添加另一個規則…

RewriteRule ^(.+)\s(.+)\s(.+)\s(.+)$ $1-$2

除非您特別需要,否則我傾向於使用多個(簡單)規則來執行此操作,而不是通用的“將所有內容轉換為單個規則”。通用規則將遞歸執行,將多個空格減少為單個字元。您可能還需要額外的標誌(即。DPI)來防止 Apache 中已知的重寫錯誤。

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