Перенаправление на документы ошибок HTTP без изменения URL-адреса запроса

Я пытаюсь показать документ об ошибке HTTP со страницы PHP, но я хотел бы, чтобы исходный URL-адрес оставался в адресной строке, чтобы не запутать сканеры поисковых систем и разрешить перезагрузку страницы в случае, если это временная проблема.

Я сделал функцию перенаправления в PHP, которая выглядит примерно так:

public static function Redirect($url, $code = '303 See Other') {
    header('HTTP/1.1 ' . $code);
    header('Location: ' . $url);
    exit(0);
}

Если я хочу отобразить документ об ошибке, такой как 403 Forbidden, я бы сделал следующее: Redirection::Redirect('/errordocs/403.php', '403 Forbidden'); и все бы работало нормально.

Как я уже сказал, URL-адрес пользователя изменится на /errordocs/403.php, чего я хочу избежать.

Что я действительно пытался сделать, так это удалить строку header('Location: ' . $url);, если код HTTP был 4xx или 5xx. Я надеялся, что это приведет к тому, что Apache отобразит правильный документ, поскольку мой .htaccess настроен так, чтобы он указывал на соответствующие страницы ошибок (что и так работает нормально).

Что я на самом деле получил от этого, так это стандартные сообщения Google Chrome, когда что-то ломается, а не мои довольно пользовательские документы об ошибках.

В быстром консенсусе, как лучше всего это сделать сейчас? Заставить эхо страницы вместо перенаправления?


person Chris Watts    schedule 22.12.2012    source источник
comment
Я бы включил страницу с ошибкой и вышел из текущего скрипта   -  person Raekye    schedule 23.12.2012
comment
@Raeki Пока что это мое решение, если технически нет ничего лучше!   -  person Chris Watts    schedule 23.12.2012


Ответы (2)


Вы можете просто отобразить содержимое HTML-кода ошибки в случае кода состояния 4xx. В противном случае перенаправить:

public static function Redirect($url, $code = '303 See Other') {
    header('HTTP/1.1 ' . $code);
    if(strpos($code, '4') === FALSE) {
        header('Location: ' . $url);
    } else {
        include(get_error_page_file_name($code));
    }
    exit(0);

}

В приведенном выше примере будет отправлен правильный код состояния HTTP, будет отображаться содержимое страницы с ошибкой и сохранен ваш URL-адрес в адресе.

person hek2mgl    schedule 22.12.2012
comment
Таким образом, для этого решения будет достаточно просто сделать include '/errordocs/{code}.php'? - person Chris Watts; 23.12.2012
comment
да include() лучше. include() на самом деле требуется, если страница ошибки содержит php-код. - person hek2mgl; 23.12.2012
comment
Я в значительной степени сделал это. Я просто добавил ob_end_clean(), а затем ob_start(), чтобы убедиться, что я не получаю вывод, который был отправлен до вызова перенаправления. - person Chris Watts; 23.12.2012

Я только что сделал то же самое, но так как это 404 - не найдено - по-моему - оно пропало...

Поэтому я установил свой файл .htaccess следующим образом:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) - [G]
ErrorDocument 410 /error404.php

Теперь каждый раз, когда кто-то нажимает на 404, он показывает красивую страницу 404, но остается на текущем URL-адресе.

ПРИМЕЧАНИЕ: вот рабочий пример файла .htacess: http://www.smdailyjournal.com/stackoverflow

И когда вы перейдете к Проверить коды заголовков, вы увидите, что он возвращает истинный 410 - Сообщение пропало :)

person MrTechie    schedule 22.12.2012
comment
На самом деле не имеет значения, это решение htaccess тоже хорошее решение - person Chris Watts; 23.12.2012
comment
Нет, не спрашивали, как лучше выполнить задание. Мое решение отвечает его просьбе, чтобы URL-адрес отображал правильный код и отображал модные страницы. - person MrTechie; 23.12.2012