HTTP_REFERER и перенаправление местоположения

Я долго искал здесь и не могу найти ответа на свой конкретный вопрос.

В сотнях мест на моем сайте я перенаправляюсь на страницу с ошибкой через перенаправление заголовка.

header("Location: /error.php");

Я хочу захватить и зарегистрировать HTTP_REFERER на странице error.php, но по какой-то причине он не установлен. Я видел объяснения, почему он не установлен с помощью мета-обновления, но заголовок местоположения - 302, поэтому его следует установить правильно? Есть предположения?

Обратите внимание: я знаю, что HTTP_REFERER ненадежен, и знаю, что могу передавать информацию отдельно. Ни то, ни другое не имеет значения в моем сценарии (если я не хочу изменить все места, где вызывается перенаправление).


person therealsix    schedule 31.08.2011    source источник
comment
возможный дубликат Будет ли 302 редирект поддерживать строку реферера?   -  person Marc B    schedule 31.08.2011
comment
Одна из проблем заключается в том, что вы не должны использовать относительные пути для заголовка Location:. В RFC2616 говорится о заголовке местоположения: The field value consists of a single absolute URI. Вы ДОЛЖНЫ использовать абсолютный путь к новому местоположению. Вы можете рассчитать это динамически из $_SERVER['HTTP_HOST'] и $_SERVER['PHP_SELF'], например. в данном случае header('http://'.$_SERVER['HTTP_HOST'].'/error.php');   -  person DaveRandom    schedule 31.08.2011
comment
@DaveRandom - Спасибо, хотя работает   -  person therealsix    schedule 31.08.2011
comment
Хотя это работает для вас, это может не работать для кого-то другого. Работает ли перенаправление с относительным путем, зависит от клиента / браузера. Да, некоторые клиенты работают с относительными путями, но в спецификации указывается, что это должен быть абсолютный URI (как указывает @DaveRandom), поэтому некоторые клиенты могут быть не такими любезными.   -  person MrWhite    schedule 01.09.2011
comment
FYI, переменная сервера пишется HTTP_REFERER, а не HTTP_REFERRER. См. php.net/manual/en/reserved.variables.server.php   -  person Justin    schedule 26.06.2014
comment
@IvanRF - Не уверен, почему вы решили отредактировать мой вопрос вместо того, чтобы указать на неправильное написание REFERER (или, скорее, мое неправильное написание). Может быть, это была моя проблема ... en.wikipedia.org/wiki/HTTP_referer   -  person therealsix    schedule 17.01.2020
comment
@therealsix было много пользователей, отметивших орфографическую ошибку, и ваш вопрос не в этом, поэтому давайте исправим орфографическую ошибку :) Кроме того, это будет легче найти в поисковых системах при поиске переменной PHP   -  person IvanRF    schedule 17.01.2020


Ответы (3)


Что ж, HTTP_REFERER устанавливается браузером, и если браузер решит не устанавливать его для перенаправления 302, чего не должно быть, то вы его не получите. 302 - это временное перенаправление, что означает, что предыдущая страница временно недоступна. Зачем браузеру отправлять информацию о странице, которой сейчас не существует?

Хорошие способы добиться этого:

  • Лично у меня есть класс Errors, который обрабатывает такие вещи, а не просто перенаправляет прямо со страницы. Это позволяет вам записывать всю необходимую информацию, даже отладочную, еще до того, как произойдет перенаправление.
  • Установите сеанс, который включает информацию о странице, и захватите эту информацию на странице ошибки для записи.
  • Вы можете попытаться установить строку Referer с помощью заголовка, но некоторые браузеры игнорируют это и не будут отправлять ее в любом случае.

На самом деле нет способа исправить это, не изменяя код в каждом месте, куда он перенаправляется, для которого вы также хотите записать информацию.

person animuson    schedule 31.08.2011
comment
Можно ли изменить вызов так, чтобы он использовал какой-либо другой http-код, который отправлял бы http_referer? Это все равно будет много изменений, но намного проще. - person therealsix; 31.08.2011
comment
Не могли бы вы передать реферер в URL? В любом случае, похоже, что это может быть глобальный поиск и замена? - person MrWhite; 01.09.2011

На самом деле это HTTP_REFERER (с единственной буквой «R» в середине) - застрявшая опечатка!

echo $_SERVER['HTTP_REFERER'];
person MrWhite    schedule 31.08.2011

Некоторые браузеры не поддерживают HTTP_REFERER. вы можете использовать isset() функцию, и очень важно использовать HTTP_REFERER, а не HTTP_REFERRER!

person Hadi77    schedule 06.02.2013