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

21

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

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

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

Эван Йеунг
источник
Если вы отказываете в доступе пользователю к существующей странице, 404 - это неправильный код ошибки. 401 или 403 будет иметь больше смысла.
moopet
1
Вы правы. У меня было впечатление от клиента, что он не хочет, чтобы кто-либо, не имеющий доступа, даже знал, что страница существует, бросив 401, он сказал бы, что она существует, но запрещена. Тем не менее, было бы легко изменить бросок 401 вместо этого.
Эван Йенг

Ответы:

52

Я смог отобразить ошибку 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

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

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

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

/**
 * Template Name: 404 Page
 */

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

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

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

Ань Чан
источник
Я думал об использовании этого. Но пара недостатков, которые я вижу, состоит в том, что два 404 шаблона должны быть созданы и поддержаны (страница и реальный). Клиент должен будет создать страницу 404. И я хотел бы сохранить URL-адрес одинаковым. Например, если я зайду на example.com/restricted , меня не перенаправят на ... / 404 /
Эван Йеунг,
На самом деле я только что понял, что 404.php является шаблоном. Моя ошибка.
Эван Йенг
Нет, это довольно ужасная идея, если вам нравится какой-либо рейтинг страниц. Поисковые системы рассматривают только страницы, которые возвращают заголовок диапазона 404 или любой диапазон 4хх, как ошибку средства просмотра, и с радостью будут индексировать все, что возвращает страницу 200. Если вы выполняете перенаправление, вы сообщаете сканерам, что ваша не найденная страница является допустимой, и это может испортить рейтинг вашей страницы. Все, что вам действительно нужно сделать, когда вы получите страницу 404, это сделать http_response_code(404); exit();. Если вы хотите страницу, то используйте get_template_part( 404 );перед выходом. Это также намного быстрее, чем любая функциональность WordPress.
Мопсид
0

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

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

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

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

Ян Чейка
источник
ОП на самом деле ищет способ отображения 404 для пользователей, которые не соответствуют определенным критериям, например: «Если у пользователя А нет возможности can_edit», отобразите страницу 404 ».
phatskat
Не перенаправлять 404 с. Location: xxxустанавливает заголовок 301, который сообщает сканерам, что на самом деле есть действительный ресурс, и убивает ваш рейтинг, когда они определяют, что его нет.
Мопсид
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();
Калян
источник