Перенаправление PHP 410

#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).