#php #http #redirect #http-status-code-410
#php #http #перенаправление #http-status-code-410
Вопрос:
Я использую WordPress и хотел бы перенаправить всех неавторизованных пользователей на домашнюю страницу.
Для этого в заголовочный файл я помещаю (в начале файла) следующий PHP-код:
if (bp_current_component() != ""
amp;amp; bp_current_component() != "event"
amp;amp; !is_user_logged_in()
amp;amp; !isset($_COOKIE[affiplus])
amp;amp; !isset($_GET[affid]))
{
header( "HTTP/1.1 410 Gone" );
header( "Location: ".get_option('siteurl')."/home/");
}
К сожалению, возвращаемый код ошибки HTTP всегда равен 302 (перемещается постоянно), а не 410, как я хочу. Почему?
Комментарии:
1. Правильный код будет 401 «Аналогично 403 Запрещено, но специально для использования, когда аутентификация возможна, но не удалась или еще не была предоставлена» en.wikipedia.org/wiki/List_of_HTTP_status_codes
2. Нет, код ответа 401 означает, что сервер ожидает, что клиент будет использовать HTTP-аутентификацию.
3. Ну, тогда 403, но 302 — это неправильный код, IMO
Ответ №1:
В качестве альтернативы вы можете использовать заголовок обновления таким образом, он по-прежнему будет отображать ответ 410, но также перенаправлять.
<?php
if (bp_current_component() != "" amp;amp;
bp_current_component() != "event" amp;amp;
!is_user_logged_in() amp;amp;
!isset($_COOKIE['affiplus']) amp;amp;
!isset($_GET['affid']))
{
header($_SERVER["SERVER_PROTOCOL"]." 410 Gone");
header("Refresh: 0; url=".get_option('siteurl')."/home/");
exit;
}
?>
Основной причиной отправки 410 (пропал) или (была страница, но теперь ее нет) было бы то, что поисковые системы не индексируют страницу.
Комментарии:
1. Я не уверен, действительно ли это имеет смысл. Сигнализация условия ошибки (4xx) и предоставление обновления кажутся противоречивыми — даже технически возможными.
2. Похоже, это технически работает, по крайней мере, в Chrome 49 и FF 45. Для меня никогда не имело смысла, что 410 Gone не следует перенаправлять, в любом случае, с точки зрения удобства использования.
3. Просто быстрое замечание, я бы не рекомендовал статически настраивать протокол заголовка. Я бы предложил небольшое обновление для:
header($_SERVER["SERVER_PROTOCOL"] . " 410 Gone", true, 410);
4. В IE, по крайней мере, с этими «короткими страницами ошибок http», установленными на on, перенаправление, к сожалению, не выполняется; но добавление заголовка местоположения перед заголовком обновления работает, как ожидалось. Я должен сказать, что предоставление заголовка Location для указания на альтернативный ресурс в любом случае семанически является хорошей идеей, ИМХО.
Ответ №2:
Вы можете отправить только один код состояния ответа. Таким образом, вы можете отправить либо ответ об ошибке (4xx), либо ответ о перенаправлении (3xx). Отправка заголовка 410, когда неавторизованный пользователь пытается получить доступ к ресурсу, в любом случае будет некорректной.
Я думаю, что просто выполнить 302 более чем достаточно.
Комментарии:
1. Я знаю, что код ошибки 410 в этом случае неверен. Я использую его, потому что мне нужно удалить эти URL-адреса из репозитория Google. Поэтому мне нужен способ перенаправить на домашнюю страницу неавторизованных пользователей и вернуть код ошибки 410 для Googlebot. Есть предложения? Спасибо
2. В этом случае введите 301 «постоянно перемещенный» и укажите на домашнюю страницу. 410 — это «это ушло, оно не вернется, не беспокойте меня снова».
Ответ №3:
Как насчет
header( "Location: ".get_option('siteurl')."/home/", true, 410);
В документах содержится подробное объяснение.
Комментарии:
1. Это фактически сгенерирует 302 независимо (в любом случае, используя Apache).