RewriteCond总是匹配不正确

如果我写:

<?php echo "SCRIPT_NAME: ".@$_SERVER['SCRIPT_NAME']."<br />"; ?> 

SCRIPT_NAME:/index.php

上面的行显示。

我正在使用这些重写

 RewriteCond %{SCRIPT_NAME} !^/index\.php$ RewriteRule .* http://example.com/404 [L] 

我检查过:

http://example.com/foo

http://example.com/bar

http://example.com/hdhd

RewriteCond匹配,然后我redirect到404

 [03/Aug/2013:13:07:48 +0200] [example.com/sid#23c3710][rid#263afe8/initial] (4) [perdir /var/www/vhosts/example.com/httpdocs/] RewriteCond: input='' pattern='!^/index\\.php$' => matched [03/Aug/2013:13:07:48 +0200] [example.com/sid#23c3710][rid#263afe8/initial] (2) [perdir /var/www/vhosts/example.com/httpdocs/] rewrite '404' -> 'http://example.com/404' [03/Aug/2013:13:07:48 +0200] [example.com/sid#23c3710][rid#263afe8/initial] (2) [perdir /var/www/vhosts/example.com/httpdocs/] implicitly forcing redirect (rc=302) with http://example.com/404 [03/Aug/2013:13:07:48 +0200] [example.com/sid#23c3710][rid#263afe8/initial] (1) [perdir /var/www/vhosts/example.com/httpdocs/] escaping http://example.com/404 for redirect [03/Aug/2013:13:07:48 +0200] [example.com/sid#23c3710][rid#263afe8/initial] (1) [perdir /var/www/vhosts/example.com/httpdocs/] redirect to http://example.com/404 [REDIRECT/302] 

但是,如果我使用example.com/index.php/nnn或example.com/index.php

我仍然被redirect

 [03/Aug/2013:13:10:41 +0200] [example.com/sid#23c3710][rid#263eff8/initial] (4) [perdir /var/www/vhosts/example.com/httpdocs/] RewriteCond: input='' pattern='!^/index\\.php$' => matched [03/Aug/2013:13:10:41 +0200] [example.com/sid#23c3710][rid#263eff8/initial] (2) [perdir /var/www/vhosts/example.com/httpdocs/] rewrite '404' -> 'http://example.com/404' [03/Aug/2013:13:10:41 +0200] [example.com/sid#23c3710][rid#263eff8/initial] (2) [perdir /var/www/vhosts/example.com/httpdocs/] implicitly forcing redirect (rc=302) with http://example.com/404 [03/Aug/2013:13:10:41 +0200] [example.com/sid#23c3710][rid#263eff8/initial] (1) [perdir /var/www/vhosts/example.com/httpdocs/] escaping http://example.com/404 for redirect [03/Aug/2013:13:10:41 +0200] [example.com/sid#23c3710][rid#263eff8/initial] (1) [perdir /var/www/vhosts/example.com/httpdocs/] redirect to http://example.com/404 [REDIRECT/302 

我在input=''看不到任何东西,每个请求都是空的。 那么永远不会像模式那样不同,那么总是会匹配的

任何build议?

你想要的Apachevariables叫做%{SCRIPT_FILENAME}

在PHP的$_SERVER超级全局中, SCRIPT_NAMESCRIPT_FILENAME存在,但在Apache中只存在%{SCRIPT_FILENAME}

从文档中不清楚每个PHPvariables包含的内容,但是在我的testing中, SCRIPT_FILENAME是一个完整的文件系统path,而SCRIPT_NAME是来自文档根目录的path或URL的path组件。