Вернуться на предыдущую страницу с заголовком («Местоположение:»); в 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)");

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

Hammad
источник
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;
6opko
источник
Это просто "" для меня.
Александр Го
2

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

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

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

if(isset($_SERVER['HTTP_REFERER'])) {
    $previous = $_SERVER['HTTP_REFERER'];
}
Мину Алекс
источник
1

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

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

Rudy
источник
почему мы не можем просто использовать $ _SERVER ['http_referrer']?
Vignesh