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

COi*_*Oil 4 mod-rewrite redirect virtualhost apache2

我实际上是RewriteMap在我的 vhost 中使用一个指令来重定向 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]
Run Code Online (Sandbox Code Playgroud)

我使用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
Run Code Online (Sandbox Code Playgroud)

例如对于这种网址,就可以了:

/associations/old_index.php /
Run Code Online (Sandbox Code Playgroud)

但是当 URL 包含空格时它不起作用:(我想它与其他特殊字符相同)

/Universités%20direct   /
Run Code Online (Sandbox Code Playgroud)

这个案子怎么处理?

小智 5

您可以使用第二个重写映射,内部函数 'escape' 这会将空格变成 %20:

RewriteMap ec int:escape

RewriteMap redirects dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db

RewriteCond ${redirects:${ec:$1}} !=""

RewriteRule ^(.*)$ ${redirects:${ec:$1}} [redirect=permanent,last]
Run Code Online (Sandbox Code Playgroud)

然后在您自己的重写映射数据库中,您可以拥有:

/Universités-direct%20/
Run Code Online (Sandbox Code Playgroud)

这应该匹配。