Перенаправление страницы с ограниченным доступом на 404

4 авг. 2011 г., 09:01:43
Просмотры: 79K
Голосов: 34

Есть ли способ показать страницу 404, если текущий авторизованный пользователь не имеет необходимых прав для просмотра страницы? Я ищу PHP-метод, что-то вроде

if( !current_user_can('administrator') ) { show_404(); exit(); }

Я думал об использовании перенаправления, но хотелось бы сохранить тот же URL.

2
Комментарии

Если вы запрещаете доступ пользователю к существующей странице, использование кода ошибки 404 некорректно. Более логично было бы использовать 401 или 403.

moopet moopet
12 июл. 2013 г. 12:18:55

Вы правы. Исходя из требований клиента, у меня сложилось впечатление, что он хотел, чтобы пользователи без доступа даже не знали о существовании страницы, а код 401 явно указывал бы на её наличие, но с ограничением доступа. Тем не менее, изменить это на возврат 401 будет несложно.

Evan Yeung Evan Yeung
12 июл. 2013 г. 22:11:57
Все ответы на вопрос 4
1
79

Мне удалось отобразить ошибку 404, используя следующий код в шапке сайта.

<?php
  global $wp_query;
  $wp_query->set_404();
  status_header( 404 );
  get_template_part( 404 ); exit();
?>

Разберём по частям:
$wp_query->set_404(): указывает wp_query, что это страница 404, что изменяет заголовок
status_header(): отправляет HTTP-заголовок 404
get_template_part(): выводит шаблон 404 страницы

28 авг. 2011 г. 17:40:37
Комментарии

Это хороший ответ, но я бы также использовал http_status_code(404); перед установкой шаблона, чтобы убедиться, что заголовок верный (что значительно быстрее, чем функция WordPress status_header( 404 );). Если вас беспокоит рейтинг страницы, вам также следует добавить правило Disallow в ваш robots.txt, чтобы указать, что это не публичный ресурс.

mopsyd mopsyd
15 мар. 2018 г. 04:12:59
3

Почему бы не создать страницу, которая показывает сообщение об ошибке, а затем перенаправляет пользователя на эту страницу? Вот простой способ реализовать это:

Откройте файл 404.php и добавьте эти строки в начало:

/**
 * Шаблон страницы: 404 Страница
 */

Создайте страницу с шаблоном 404 Страница. Затем перенаправьте пользователей:

if ( !current_user_can('administrator') ) {
    $404_page = get_permalink( $404_page_id );
    wp_redirect( $404_page );
    exit();
}

Причина, по которой следует использовать страницу для 404 ошибки: в WordPress страница 404 фактически является страницей, которой не существует, WordPress должен проверить весь свой контент перед тем, как вернуть страницу 404, и эта работа является пустой тратой ресурсов. Использование предварительно настроенной страницы может помочь сделать ваш блог быстрее.

4 авг. 2011 г. 09:39:22
Комментарии

Я думал об использовании этого. Но пара недостатков, которые я вижу, это то, что придется создавать и поддерживать два шаблона 404 (страницы и реальный). Клиенту нужно будет создать страницу 404. И я хотел бы оставить URL таким же. Например, если я перейду по http://www.example.com/restricted, я не хочу перенаправляться на .../404/

Evan Yeung Evan Yeung
4 авг. 2011 г. 10:02:51

Вообще-то я только что понял, что 404.php — это шаблон. Моя ошибка.

Evan Yeung Evan Yeung
4 авг. 2011 г. 10:24:05

Нет, это довольно ужасная идея, если вы хотите сохранить какой-либо рейтинг страниц. Поисковые системы считают страницы, возвращающие заголовок 404 или любой из диапазона 4xx, как ошибку для пользователя, и будут охотно индексировать всё, что возвращает страницу с кодом 200. Если вы делаете перенаправление, то сообщаете краулерам, что ваша страница "не найдена" является валидной страницей, что сильно испортит ваш рейтинг. Всё, что вам действительно нужно делать при получении страницы 404 — это http_response_code(404); exit();. Если вам нужна страница, используйте get_template_part( 404 ); перед выходом. Это также намного быстрее, чем любая функциональность WordPress.

mopsyd mopsyd
15 мар. 2018 г. 04:05:02
0

У меня было похожее требование, где я не должен был позволять пользователям доступ к странице author.php в зависимости от их роли. Я зарегистрировал действие template_redirect для выполнения проверок и перенаправления на страницу 404 еще до фактической загрузки страницы.

Регистрация:

add_action( 'template_redirect', [ $this, 'handle_inactive_users']);

Обработчик:

public function handle_inactive_users() {
    global $wp_query;
    if ( $wp_query->is_author() ) {
        $user = $wp_query->get_queried_object();
        if ( is_a( $user, \WP_User::class ) && $user->has_cap( 'inactive' ) ) {
            $wp_query->set_404();
            status_header( 404 );
            get_template_part( 404 );
            exit();
        }
    }
}

Если вы решите использовать только следующий фрагмент кода в середине шаблона, страница может быть уже частично отрисована, и вы не будете фактически перенаправлены на страницу 404. Поэтому лучше делать это в действии template_redirect -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
26 сент. 2017 г. 19:52:46
2

Вы можете записать этот код в файл 404.php в директории используемой темы (wp-content/themes/..../404.php):

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>

Этот код должен начинаться с самого начала файла (без каких-либо символов перед ним).

Ссылка на оригинал: Как перенаправить страницу 404 на главную в WordPress

5 июн. 2017 г. 17:39:09
Комментарии

Автор ищет способ отображать 404 ошибку для пользователей, которые не соответствуют определённым критериям, например: "Если пользователь А не имеет права 'can_edit', то показывать страницу 404."

phatskat phatskat
5 июн. 2017 г. 18:18:45

Не делайте редирект для 404 ошибок. Location: xxx устанавливает заголовок 301, который сообщает краулерам, что ресурс существует, что негативно скажется на ранжировании, когда они обнаружат, что это не так.

mopsyd mopsyd
15 мар. 2018 г. 04:10:38