在目录$HOME/public_html/test
中有两个文件.htaccess
和query.cgi
。我想将xxx.cgi?yyy
转换为query.cgi?a=xxx&yyy
。
htaccess的:
RewriteEngine on
RewriteRule ^(.*)\.cgi\?(.*)$ query.cgi?a=$1&$2
RewriteRule ^(.*)\.cgi$ query.cgi?b=$1
query.cgi(用于检查查询的CGI):
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
my $query = $ENV{QUERY_STRING} ||= "no query";
print "Content-Type: text/html; charset=utf-8\n\n";
print "<html><body><p>". $query . "</p></body></html>";
问题是:如果我访问xxx.cgi?yyy
,则查询为b=query
。
我希望应用第一条规则,以便查询为a=xxx&yyy
。但是第一个规则被忽略并且第二个规则被应用,尽管由于正则表达式而无法应用第二个规则。
答案 0 :(得分:0)
您需要考虑的是查询字符串不是匹配的一部分,而是存储在其自己的独立变量QUERY_STRING
中。正如您在脚本中使用的那样。所以你需要做这样的事情:
RewriteCond %{REQUEST_URI} !^/query\.cgi$
RewriteRule ^(.+)\.cgi$ /query.cgi?a=$1 [QSA]
使用[QSA]
标志表示附加到查询字符串而不是覆盖。