我有一个像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
答案 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]