PHP или htaccess делают страницу динамического URL-адреса равным 404, когда элемент отсутствует в БД

Типичный сценарий:

  1. Элементы DB перемещаются на странице http://...?item_id=467
  2. Пользователь однажды удаляет элемент
  3. Google или пользователь пытается получить доступ к http://...?item_id=467
  4. PHP diggs в БД и видит, что элементы больше не существуют, поэтому теперь PHP должен сказать Google / пользователю, что этот элемент не существует через заголовок и страницу 404.

Согласно этому ответу, я понял, что нет возможности перенаправлять на страницу 404 Apache через PHP, если не отправлять в код заголовок 404 + чтение и передачу клиенту всего содержимого вашей 404-страницы по умолчанию.

Задача: у меня уже есть анализируемая страница Apache parseed 404. shtml , поэтому obvioulsy я бы хотел просто использовать эту страницу. Но если я прочитаю страницу shtml через PHP, она больше не будет анализироваться Apache .

Итак, что вы предлагаете мне делать?

Может быть, какой-нибудь трюк, который я мог бы использовать с помощью htaccess?

    Благодаря,

    Related of "PHP или htaccess делают страницу динамического URL-адреса равным 404, когда элемент отсутствует в БД"

    Хм. На ум приходят две идеи:

    • Перенаправление на страницу 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, но вы можете предоставить настраиваемые элементы в сообщениях об ошибке или замене.