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

我实际上在我的虚拟主机中使用RewriteMap指令来redirect800个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文件。 然后它被转换成一个数据库文件:

 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 

例如对于这种types的URL,这是可以的:

 /associations/old_index.php / 

但是当URL包含空格时,它不起作用:(我想这与其他特殊字符是一样的)

 /Universités%20direct / 

如何处理这种情况?

解决方法可能是在内部重写包含连字符空格的 URL(用连字符replace空格),而是在重写映射中包含带有连字符的URL。

如果你只有一些在URL中包含一个空格的URL,你可以在现有的指令之前使用类似下面的指令:

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

然后在您的重写映射中使用以下内容:

 /Universités-direct / 

更新:如果你有包含两个空格的URL(比如/the force awakens ),而另一些则只有一个空格,那么你可以添加一个额外的规则:

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

这些规则确实假设您没有以空格结尾的URL。 没有一个URL有多个连续的空间。

如果三个空格,然后在上面添加另一个规则…

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

我倾向于用多个(简单)规则来做到这一点,而不是一个通用的“在一个单一的规则中转换所有东西”,除非你特别需要这个。 通用规则将recursion运行,将多个空格减less为单个字符。 您也可能需要额外的标志(即DPI )来防止Apache中的已知重写错误。

您可以通过从%{THE_REQUEST}variables中提取编码的URI并使用它来执行查找来解决此问题。 当然,你需要把编码的URI放在地图上。 像下面这样:

 RewriteEngine On
 RewriteMapredirectdbm = db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db
 RewriteCond%{THE_REQUEST}“\ w +([^] +)”
 RewriteRule ^  -  [E = MYVAR:%1]

 RewriteCond $ {redirects:%{ENV:MYVAR}}!=“”
 RewriteRule ^ $ {redirects:%{ENV:MYVAR}} [redirect = permanent,last] [B]

我只用基于文本的地图而不是数据库testing了它。 如果您必须使用查询string处理url,这可能需要修改。