Virtualhost
帶有包含空格的 URL 的 Apache RewriteMap 不起作用
我實際上
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 中已知的重寫錯誤。