PHP или htaccess делают страницу динамического URL-адреса 404, если элемент отсутствует в БД - PullRequest
2 голосов
/ 20 ноября 2010

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

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

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

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

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

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 20 ноября 2010

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

  • Перенаправление на страницу 404 с помощью header("Location:...") - это не соответствует стандартам. Я бы использовал это только в качестве последней капли

  • Извлечение и вывод файла SHTML, проанализированного Apache, с использованием file_get_contents("http://mydomain.com/404.shtml"); - также не на самом деле оптимальный, потому что запрос сделан на веб-сервер, но, я думаю, приемлемым в большинстве случаев.

Я сомневаюсь, что вы можете сделать что-нибудь в .htaccess, потому что скрипт PHP запускается после того, как какие-либо правила перезаписи уже были проанализированы.

2 голосов
/ 20 ноября 2010

Если вы используете apache mod_php, используйте virtual('/404.shtml');, чтобы отобразить проанализированную страницу shtml для вашего пользователя.

0 голосов
/ 05 декабря 2015

Я искал именно то, что вам нужно, поэтому у вас есть страница:

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

?>

Так что, если элемент больше не находится в БД, страница 404 отображается, но вы можете предоставитьпользовательские элементы в сообщениях о замене или ошибках.

0 голосов
/ 20 ноября 2010

Вчера я пытался сделать то же самое.

В результате файл_get_contents / Pekka приводит к отправке заголовка статуса 404?Возможно, вам нужно сделать это перед тем, как добавить пользовательскую страницу с ошибкой?

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

Вы можете протестировать, используя это расширение Firefox .

...