Типичный сценарий:
http://...?item_id=467
http://...?item_id=467
Согласно этому ответу, я понял, что нет возможности перенаправлять на страницу 404 Apache через PHP, если не отправлять в код заголовок 404 + чтение и передачу клиенту всего содержимого вашей 404-страницы по умолчанию.
Задача: у меня уже есть анализируемая страница Apache parseed 404. shtml , поэтому obvioulsy я бы хотел просто использовать эту страницу. Но если я прочитаю страницу shtml через PHP, она больше не будет анализироваться Apache .
Итак, что вы предлагаете мне делать?
Может быть, какой-нибудь трюк, который я мог бы использовать с помощью htaccess?
Благодаря,
Хм. На ум приходят две идеи:
Перенаправление на страницу 404 с использованием header("Location:...")
– это не стандартное поведение. Я бы использовал это только как последнюю каплю
Выбирает и выводит файл SHTML, обработанный Apache, с помощью file_get_contents("http://mydomain.com/404.shtml");
– также не совсем оптимально, потому что запрос делается на веб-сервер, но, я думаю, приемлемый в большинстве случаев.
Я сомневаюсь, что есть что-то, что вы можете сделать в .htaccess
потому что PHP-скрипт работает после того, как все правила перезаписи уже проанализированы.
Если вы используете apache mod_php, используйте virtual('/404.shtml');
для отображения страницы анализатора shtml для вашего пользователя.
Вчера я пытался сделать то же самое.
Pekka's file_get_contents / include приводит к отправке заголовка статуса 404? Возможно, вам нужно сделать это, прежде чем включать страницу пользовательских ошибок?
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
Вы можете протестировать это расширение Firefox .
Я искал то, что вам нужно, поэтому у вас есть страница:
http://example.com/page?item_id=456
и если позже вы захотите, чтобы, если элемент отсутствует, вы перенаправлены на:
http://example.com/page_not_found?item_id=456
На самом деле я обнаружил, что гораздо более удобное решение просто использовать исходную страницу как 404 страницы.
<?php $item = findItem( $_GET['item_id']); if($item === false){ //show 404 page sending correct header and then include 404 message header( $_ENV['SERVER_PROTOCOL'].' 404 Not Found', true ); // you can still use $_GET['item_id'] to customize error message // "maybe you were looking for XXX item" include('somepath/missingpage.php'); return; } //continue as usual with normal page ?>
в<?php $item = findItem( $_GET['item_id']); if($item === false){ //show 404 page sending correct header and then include 404 message header( $_ENV['SERVER_PROTOCOL'].' 404 Not Found', true ); // you can still use $_GET['item_id'] to customize error message // "maybe you were looking for XXX item" include('somepath/missingpage.php'); return; } //continue as usual with normal page ?>
Поэтому, если элемент больше не находится в БД, отображается страница 404, но вы можете предоставить настраиваемые элементы в сообщениях об ошибке или замене.