最简单的方法是,如果您可以在网站配置中输入RewriteMap prg:foo
。请注意,就我所知,您不能在.htaccess
中使用RewriteMap
。
如果你有访问服务器的配置文件,添加这样的事情,无论是在全球还是在<VirtualHost>
:
RewriteMap forum prg:/path/to/forum-rewriter.pl
然后在你选择的.htaccess
尝试:
RewriteRule ^forum/.* ${forum:$0} [QSA]
(在你尝试RewriteRule
它看起来像你想匹配的路径开始于forum/
所以这就是我在这里做的。)
接下来你需要做forum-rewriter.pl
:
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
while ($_ = <STDIN>) {
chomp($_);
if (s,^forum/([^/]+)(/\+)?(/.*)?,forum.php?name=$1, && $3) {
my $query_string = $3;
$query_string =~ s,/([^/_]+)_([^/_]+),&$1=$2,g;
$_ .= $query_string;
}
print "$_\n";
}
确保chmod 755 /path/to/forum-rewriter.pl
。
RewriteMap
将导致Apache在启动时为每个httpd进程启动forum-rewriter.pl
一次。每当RewriteRule
的模式匹配时,它就会写入forum-rewriter.pl
stdin的路径。 forum-rewriter.pl
将在URL上完成其工作(如果有)并将结果打印回Apache。
仅供参考,它很容易测试forum-rewriter.pl
。只要运行它,并开始发送它的路径:
$ /tmp/forum-rewriter.pl
forum/Nome+del+Forum/+/page_1/action_do
forum.php?name=Nome+del+Forum&page=1&action=do
forum/Nome+del+Forum/page_1/action_do
forum.php?name=Nome+del+Forum&page=1&action=do
forum/Nome+del+Forum
forum.php?name=Nome+del+Forum
foo
foo
如果您不能使用RewriteMap
,我想这可能与mod_rewrite
但我认为这是很危险的:
RewriteCond %{ENV:SetForumName} =""
RewriteRule ^forum/([^/]+)(/\+)?(/.*)? /forum.php$3?name=$1 [QSA,E=SetForumName:1]
RewriteCond %{ENV:SetForumName} !=""
RewriteRule ^forum.php/([^/_]+)_([^/_]+)(/.*)? /forum.php$3?$1=$2 [N,QSA]
这是危险的,因为这[N]
导致Apache在第二个RewriteRule
匹配时重新开始处理所有重写规则。如果你不小心,你会创建一个无限循环,并且Apache将要求500或者咆哮。还要注意它设置SetForumName
环境变量的副作用。但是,这是我能找到的唯一方法,可以告诉mod_rewrite“在查询字符串中用foo=bar
替换全部foo_bar
”。
对不起,但我不明白!我不想要完整的代码,但了解代码如何。 页面将始终是论坛和值不用斜线分隔,而是“_”或“:”。使用此代码:
它工作一半,只取第一个参数。 谢谢! – 2010-04-17 08:37:45FedericoBiccheddu,我添加了更多的解释。我希望这有帮助。我知道你的URL使用'_'而不是'/',但是如果你使用一个稍微不同的正则表达式,这个概念应该也可以工作。 – bmb 2010-04-17 15:51:16