我实际上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 /
如何处理这种情况?
您可以使用第二个重写映射,内部函数 'escape' 这会将空格转换为 %20:
然后在您自己的重写地图数据库中,您可以拥有:
这应该匹配。
您可以通过从 %{THE_REQUEST} 变量中提取编码的 URI 并使用它进行查找来解决此问题。当然,您需要将编码的 URI 放入地图中。类似于以下内容:
我只使用基于文本的地图而不是 DB 地图对其进行了测试。如果您必须处理带有查询字符串的 URL,这可能需要修改。
一种解决方法可能是在内部将包含空格的 URL 重写为连字符(用连字符替换空格),并将连字符的 URL 包含在重写映射中。
如果您只有一些在 URL 中包含单个空格的 URL,那么您可以在现有指令之前使用类似于以下指令的内容:
然后在重写映射中使用以下内容:
更新:如果您的 URL 包含两个空格(例如。
/the force awakens
)和一些包含一个空格的 URL,那么您可以添加一个附加规则:这些规则确实假定您没有以空格结尾的 URL。并且没有一个 URL 有超过一个连续的空间。
如果三个空格然后在上面添加另一个规则...
除非您特别需要,否则我倾向于使用多个(简单)规则来执行此操作,而不是通用的“将所有内容转换为单个规则”。通用规则将递归运行,将多个空格减少为单个字符。您可能还需要额外的标志(即。
DPI
)来防止 Apache 中已知的重写错误。