Вернуться на предыдущую страницу с заголовком («Местоположение:»); в PHP


124

Название этого вопроса как бы объясняет мой вопрос. Как перенаправить посетителя страницы PHP обратно на предыдущую страницу с помощьюheader( "Location: URL of previous page" );


заголовок ('Местоположение:'. $ _SERVER ['HTTP_REFERER']);
раскул

Согласно этому источнику w3schools.com/php/php_superglobals_server.asp , это ненадежно, потому что не все поставщики его поддерживают
мохаденнис,

Ответы:


246

пытаться:

header('Location: ' . $_SERVER['HTTP_REFERER']);

Обратите внимание, что это может не работать с защищенными страницами (HTTPS), и в целом это довольно плохая идея, поскольку заголовок может быть взломан, отправив пользователя в другое место назначения. Заголовок может даже не быть отправлен браузером.

В идеале вам нужно:

  • Добавьте адрес возврата к запросу в качестве переменной запроса (например,? Back = / list)
  • Определите страницу возврата в своем коде (т. Е. Все успешные отправленные формы перенаправляют на страницу списка)
  • Предоставьте пользователю возможность выбрать, куда он хочет перейти дальше (например, сохранить и продолжить редактирование или просто сохранить).

19
Происходили и более странные вещи :)
Дмитрий

3
@Col, так ты можешь доказать практическую проблему с этим?
Pekka

1
Использование реферера после предварительного тестирования того, что он установлен и действителен, в определенном межстраничном контексте может быть вполне приемлемой практикой - подавляющее большинство браузеров отправляет правильный HTTP_REFERER.
Pekka

1
@Col Я использовал это в производстве, когда мне нужно было что-то сделать для демонстрации. Как видно из моего ответа, вместо перенаправления на основе HTTP_REFERER я предлагаю три других решения.
Димитрий

2
@Madmartigan звучит как очень странное поведение, единственный намек, который я вижу в сети, вызывающий некоторые проблемы с перенаправлением. В любом случае, я согласен с тем, что использование реферера не подходит, если вам нужна 100% безопасность
Пекка

22

Это так просто, просто используйте это

header("location:javascript://history.go(-1)");

Он отлично работает для меня


2
Это звучало очень умно, но в FF10 я понял, что "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."это в основном непригодно.
Уэсли Марч,

Уэсли Марч, У меня он отлично работает почти во всех основных браузерах, включая тот, который вы упомянули. Это работает для вас только в том случае, если вы зашли на страницу с историей.
Hammad

5
Это может привести к тому, что предыдущая страница будет обслуживаться из кеша браузера.
aksu

14

Вы должны как-то сохранить это место.

Скажем, это форма POST, просто поместите текущее местоположение в скрытое поле, а затем используйте его в header()Location.


14

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

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;

Это просто "" для меня.
Александр Го

2

Просто попробуйте это в Javascript:

 $previous = "javascript:history.go(-1)";

Или вы можете попробовать это на PHP:

if(isset($_SERVER['HTTP_REFERER'])) {
    $previous = $_SERVER['HTTP_REFERER'];
}

1

Хранить предыдущий URL-адрес в переменной сеанса - это плохо, потому что пользователь может щелкнуть правой кнопкой мыши несколько страниц, а затем вернуться и сохранить.

если вы не сохраните предыдущий URL-адрес в переменной сеанса в скрытое поле в форме и после сохранения заголовка («Местоположение: сохранить URL-адрес вызывающей страницы»);


почему мы не можем просто использовать $ _SERVER ['http_referrer']?
Vignesh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.