web-dev-qa-db-ja.com

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が一致すると、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を使用する場合

まだリダイレクトされています

[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 = ''には何も表示されません。リクエストごとに、空になっています。その後、パターンのように異なることはなく、常に一致します

なにか提案を?

1
Jvrq

必要なApache変数は%{SCRI­PT_­FIL­ENAME}と呼ばれます。

PHPの$_SERVERスーパーグローバルでは、SCRIPT_NAMESCRIPT_FILENAMEの両方が存在しますが、Apacheでは%{SCRIPT_FILENAME}のみが存在します。

ドキュメント からは明確ではありませんが、PHP変数のそれぞれに含まれるものは正確ですが、私のテストでは、SCRIPT_FILENAMEは完全なファイルシステムパスであり、SCRIPT_NAMEは、ドキュメントルートからのパスまたはURLのパスコンポーネントのいずれかです。

1
Ladadadada