2010-09-09 3 views
4

Это кажется таким простым, но я не могу понять это. Я бы хотел, чтобы все запросы были переписаны index.php (что будет интерпретировать запрос) , кроме 404.html, который должен переписываться непосредственно на 404.php.Простой вопрос об ошибке RewriteRule

Следующий код действительно работает при переписывании всего файла index.php, но 404.php никогда не запускается.

Я пропустил строку 3, потому что я не знаю, что она делает.

Options +FollowSymlinks 
RewriteEngine on 
#RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^404.html$ 404.php [L] 
RewriteRule ^(.*)$ index.php [QSA] 

Как вы можете видеть, мои потребности очень просты, но так же и мой мозг! Пожалуйста помоги!

Спасибо.

EDIT

Эта линия работает отлично по себе:

RewriteRule ^404.html$ 404.php 

но когда другой RewriteRule вводится, все становится продавливают через index.php - даже 404.html .... .. (Я тоже пытался изменить порядок).

+1

строка три говорит: «Следующее правило применяется только в том случае, если запрошенное имя файла не является существующим файлом. (-f - это файл, -d - это каталог и т. д.) –

ответ

0

Это вело меня MAD!, но я нашел ответ, для тех, кто путается, как и я.

Посмотрите на линии 4:

Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^404.html$ 404.php [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php 

Взято из: easymodrewrite:

код [L] флаг может привести к неожиданным результатам, если вы не ясно, о том, как ведет себя модуль. Обратите внимание, что следующее применимо только тогда, когда mod_rewrite используется в файле .htaccess. Флаг [L] ведет себя точно так, как ожидалось, когда используется в httpd.conf.

Флаг L сообщает Apache о прекращении обработки правил перезаписи для этого запроса. Теперь то, что часто нереализуется, заключается в том, что теперь он делает новый запрос для нового, переписанного имени файла и снова начинает обработку правил перезаписи.


В принципе, вы должны сказать второе правило, не совпадают существующие файлы (404.php реальный файл, а не динамический).

Надеюсь, это поможет кому-то.

1

Вы можете инвертировать результат матча, указав его с помощью !. Итак:

RewriteRule ^404\.html$ 404.php 
RewriteRule !^404\.html$ index.php [QSA] 

Это будет соответствовать любому запросу, что это путь не соответствует по ^404\.html$.

Вам может понадобиться добавить условие, что закомментирована:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^404\.html$ index.php [QSA] 

Теперь это правило будет соответствовать только если запрос не может быть дополнительно отображается на существующий файл.

+0

Я не понимаю, как это помогает - я хочу, чтобы 404.html переписывался на 404.php ... и все остальное в index.php с requesnt как строка запроса. – Greg

+0

@Greg: Исправлено. – Gumbo

+0

hmm, используя то, что вы положили, запрашивая 404.html все равно попадает в index.php ... что я делаю неправильно? – Greg

0

Я предлагаю такое решение:

Options +FollowSymlinks 
RewriteEngine on 
#RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^404.html$ 404.php [L] 
RewriteRule ^(.*)$ index.php [QSA] 

Я считаю, что вопрос заключается в том, что вы переписывания URL в 404.php, а затем отправить его в index.php. Полагая [L] после первого правила, команда rewrite будет продолжать переписывать.

+0

доступ к 404.html по-прежнему перенаправляется через index.php! Что мне не хватает ??? – Greg

Смежные вопросы