如何使用Apache重写规则删除两者之间的特定字符

时间:2017-01-31 01:12:07

标签: regex apache .htaccess

我有一个像http://example.com/abc+def+cde+ndk

这样的网址

不幸的是,URI中的捕获组数量(abc,def,cde ..)不是固定数量。

我尝试编写如下所示的规则,但它只匹配并替换三个组(两个字符组和一个+中间)。

RewriteCond %{REQUEST_URI} ^/(.*?)(\+{1,})(.*)$ [NC]
RewriteRule . http://example.com/%1%3 [R=301,L]

以下示例:

来源:example.com/abc+def+cde+x+y(n以+分隔的字符串数量)
目的地必须是:example.com/abccdexy...till n

2 个答案:

答案 0 :(得分:1)

如果您可以向主配置添加指令,最好的解决方案是使用RewriteMap来处理通过您编写的外部脚本重写URL。您可以找到details on that here

基本上你做的事情如下:

RewriteMap convertUrl "prg:/www/bin/convertUrl.pl"
RewriteRule \+ ${convertUrl:%{REQUEST_URI}} [R=301,L]

(只有RewriteMap需要进入主配置,RewriteRule可以进入.htaccess

其中/www/bin/convertUrl.pl是您编写的脚本,用于处理替换,如上面的链接所述。它应该采用STDIN上的URL(没有任何缓冲),去掉加号,然后在STDOUT上返回。

这样的事情应该有效:

#!/usr/bin/perl
$| = 1; # Turn off I/O buffering
while (<STDIN>) {
    s/\+//g; # Replace dashes with underscores
    print $_;
}

答案 1 :(得分:1)

这是一个纯粹的.htaccess解决方案。

# Remove a plus sign on each iteration of the rule
RewriteRule ^help/col/([^+/]+)\+([^/]+)$ help/col/$1$2 [E=REMOVED_PLUS_SIGNS:1]
# For URLs that were processed, redirect once all the plus signs are removed
RewriteCond %{ENV:REMOVED_PLUS_SIGNS} =1
RewriteRule ^help/col/([^+/]+)$ /help/col/$1 [R=301,L]