Перенаправить страницу с ограниченным доступом на 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();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.