Назад | Перейти на главную страницу

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 = '', он пуст при каждом запросе. Тогда никогда не будет отличаться от шаблона, тогда всегда будет соответствовать

Любое предложение?

Нужная переменная Apache называется %{SCRI­PT_­FIL­ENAME}.

В PHP $_SERVER супер глобальный, оба SCRIPT_NAME и SCRIPT_FILENAME существуют, но в Apache только %{SCRIPT_FILENAME} существуют.

Это не ясно из документация что именно содержит каждая из переменных PHP, но в моем тестировании SCRIPT_FILENAME это полный путь к файловой системе и SCRIPT_NAME - это либо путь от корня документа, либо компонент пути URL-адреса.