2017-06-15 41 views
0

在目录$HOME/public_html/test中有两个文件.htaccessquery.cgi。我想将xxx.cgi?yyy转换为query.cgi?a=xxx&yyyRewriteRule以奇怪的方式工作

的.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

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

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

随着[QSA]标志,它表示追加到查询字符串,而不是覆盖。