Повернутися до попередньої сторінки із заголовком ("Місцезнаходження:"); в PHP


124

Назва цього питання пояснює моє запитання. Як перенаправити відвідувача сторінки PHP назад на попередню сторінку з допомогоюheader( "Location: URL of previous page" );


заголовок ('Місцезнаходження:'. $ _SERVER ['HTTP_REFERER']);
raskul

Відповідно до цього джерела w3schools.com/php/php_superglobals_server.asp , це не є надійним, оскільки підтримують його не всі постачальники
mohadennis

Відповіді:


246

спробуйте:

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

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

В ідеалі вам потрібно буде:

  • Додайте зворотну адресу до запиту як змінну запиту (наприклад?? Back = / list)
  • Визначте в своєму коді сторінку повернення (тобто всі успішні подання форми переспрямовують на сторінку переліку)
  • Надайте користувачеві можливість вибрати, куди він хоче йти далі (наприклад, Зберегти та продовжити редагування або просто Зберегти)

19
Дивніші речі траплялися :)
Димитрій

3
@Col, щоб ви могли довести практичну проблему з цим?
Pekka

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

1
@Col Я використовую це у виробництві, коли мені довелося щось зробити для демонстрації. Як видно з моєї відповіді, я пропоную три інші рішення, до яких я звернувся б замість перенаправлення на основі HTTP_REFERER.
Димитрій

2
@Madmartigan, що звучить як дійсно дивна поведінка, єдиний натяк, який я бачу в мережі, викликає це деякі проблеми з перенаправленням. Так чи інакше, я погоджуюся, що використання реферера - це не такий спосіб, якщо вам потрібна 100% безпека
Pekka

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."це в основному непридатно.
Веслі Мерч

Уеслі Мерч, його чудова робота майже для кожного головного браузера включала ту, яку ви згадали. Його робота для вас тільки в тому випадку, якщо ви зайшли на сторінку, яка має щось в історії.
Хаммад

5
Це може спричинити показ попередньої сторінки з кешу браузера.
аксу

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']?
Виньєш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.