Apache 重写规则的工作方式很奇怪

Apache 重写规则的工作方式很奇怪,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,在目录$HOME/public\u 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/p

在目录
$HOME/public\u 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
严格使用;
使用警告;
使用utf8;
我的$query=$ENV{query_STRING}| |=“无查询”;
打印“内容类型:text/html;字符集=utf-8\n\n”;
打印“”$查询“

”;
问题是:如果我访问
xxx.cgi?yyy
,那么查询是
b=query


我希望应用第一条规则,因此查询是
a=xxx&yyy
。但是第一条规则被忽略,第二条规则被应用,尽管第二条规则由于regex而无法应用

您需要考虑的是,查询字符串不是匹配的一部分,而是存储在自己的单独变量中,该变量名为
query\u string
。正如您在脚本中使用的那样。所以你需要这样做:

RewriteCond %{REQUEST_URI} !^/query\.cgi$
RewriteRule ^(.+)\.cgi$ /query.cgi?a=$1 [QSA]
使用
[QSA]
标志,该标志表示追加到查询字符串,而不是覆盖

RewriteCond %{REQUEST_URI} !^/query\.cgi$
RewriteRule ^(.+)\.cgi$ /query.cgi?a=$1 [QSA]