$ _SERVER ['HTTP_REFERER'] не работает с заголовком - PullRequest
1 голос
/ 15 мая 2010

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

Мне любопытно, почему он не работает в сочетании с перенаправлением. Я установил видимое поле, содержащее значение http referer, и оно отображается правильно. Таким образом, страница получает значение переменной referrer. Но когда я попробую это:

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

это не работает. Это, с другой стороны, делает:

$home_url = 'http://' . $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/discussions.php';
header('Location: ' . $home_url);

Итак, я знаю, что часть расположения заголовка работает. Есть идеи, почему он не хочет работать вместе с переменной http_referer?

(Кроме того, это сводит кого-то с ума, что реферер написан неправильно? Я продолжаю опечатывать его, используя написание OED, глупый я ...)

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

Каково значение $_SERVER['HTTP_REFERER'] в первом примере? Правильно ли установлено?

Знаете, если вы просто наберете URL в адресной строке, большинство браузеров не будут отправлять строку реферера.

1 голос
/ 15 мая 2010

На странице проверки входа в систему реферером будет страница входа в систему, а не исходная (если вы не используете учетные данные, сохраненные в файле cookie или в HTTP / basic / digest auth).

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

Еще лучше: поскольку пользователь не может отправлять реферер (это настраивается в большинстве браузеров), сделайте так, чтобы ссылка на страницу входа включала в строку запроса исходную страницу. Затем действуйте, как указано выше, но используйте это значение вместо referer.

Чтобы быть ясным:

<form method="post" action="login">
...
<input name="user" type="text" />
<input name="password" type="password" />
<input name="referer" type="hidden" value="<?php echo urlencode($_SERVER['HTTP_REFERER']) ?>" />
</form>

1010 * тогда *

<?php
if (login_is_successful() && !empty($_POST['referer']) && !is_array($_POST['referer'])) {
    header("Location: ".urldecode($_POST['referer']));
    die();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...