RewriteRule以一种奇怪的方式工作

时间:2017-06-15 22:40:21

标签: apache .htaccess mod-rewrite

在目录$HOME/public_html/test中有两个文件.htaccessquery.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。但是第一个规则被忽略并且第二个规则被应用,尽管由于正则表达式而无法应用第二个规则。

1 个答案:

答案 0 :(得分:0)

您需要考虑的是查询字符串不是匹配的一部分,而是存储在其自己的独立变量QUERY_STRING中。正如您在脚本中使用的那样。所以你需要做这样的事情:

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

使用[QSA]标志表示附加到查询字符串而不是覆盖。