Как создать пользовательские страницы ошибок 401, 403 и 500?

27

При обнаружении ошибки 404 файл шаблона 404.php можно использовать для отображения настраиваемого сообщения об ошибке. Это описано в статье « Иерархия шаблонов» .

Моя цель - создать пользовательские страницы ошибок для ошибок 401, 403 и 500. Я попытался создать файлы 401.php, 403.php и 500.php в каталоге моей темы, но это не работает.

Как я могу создать пользовательские страницы ошибок 401, 403 и 500 в WordPress?

henrywright
источник
2
Вы можете попробовать использовать этот код в качестве отправной точки: jesin.tk/wordpress-custom-403-401-error-page
Joe
Вот существующий плагин, который позволяет настраивать страницы ошибок, такие как ошибки 403 и 401: http://wordpress.org/plugins/custom-error-pages/ Все, что вам нужно сделать, это установить и активировать. Однако вы должны вручную отредактировать файл .htaccess (или nginx.conf), указанный на странице настроек плагинов.
Pi Lover

Ответы:

15

Страницы ошибок обслуживаются через .HTACCESS, если вы используете Apache, вы бы использовали ErrorDocumentдирективу и добавили к ней статус и URL.

Так это будет выглядеть в вашем файле .htaccess:

ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500

Вы можете использовать следующую функцию ниже. Это будет динамически добавлять то, что вам нужно, в файл HTACCESS, или вы можете сделать это вручную.

1. Добавить страницы:

Затем вам нужно будет зайти в свою панель инструментов и создать страницы, как и любую обычную страницу («Панель инструментов»> «Страницы»> «Создать»). Они могут называться как угодно, просто убедитесь, что слаг такой же, как в приведенной ниже функции (Слаг: ошибка-401, ошибка-403, ошибка-404, ошибка-500). Также вы можете использовать шаблон страницы для создания любого макета и стиля, который вы хотите для этих конкретных страниц. Следуйте инструкциям WordPress Codex для этого.

2. Добавить функцию:

// Create Custom Error Pages in WordPress using HTACCESS
function royal_custom_error_pages() {

    // Get HTACCESS path & dynamic website url
    $htaccess_file = '.htaccess';
    $website_url = get_bloginfo('url').'/';

    // Check & prevent writing error pages more than once
    $check_file = file_get_contents($htaccess_file);
    $this_string = '# BEGIN WordPress Error Pages';

    if( strpos( $check_file, $this_string ) === false) {

    // Setup Error page locations dynamically
    $error_pages .= PHP_EOL. PHP_EOL . '# BEGIN WordPress Error Pages'. PHP_EOL. PHP_EOL;
    $error_pages .= 'ErrorDocument 401 '.$website_url.'error-401'.PHP_EOL;
    $error_pages .= 'ErrorDocument 403 '.$website_url.'error-403'.PHP_EOL;
    $error_pages .= 'ErrorDocument 404 '.$website_url.'error-404'.PHP_EOL;
    $error_pages .= 'ErrorDocument 500 '.$website_url.'error-500'.PHP_EOL;
    $error_pages .= PHP_EOL. '# END WordPress Error Pages'. PHP_EOL;

    // Write the error page locations to HTACCESS
    $htaccess = fopen( $htaccess_file, 'a+');
    fwrite( $htaccess, $error_pages );
    fclose($htaccess);

    }
}

add_action('init','royal_custom_error_pages'); // This will run the function everytime, not ideal!

// register_activation_hook( __FILE__, 'royal_custom_error_pages' ); // Using a plugin, runs only once!

NB !! ЗАМЕЧАНИЯ О ВЫШЕ ФУНКЦИИ

При перемещении вашего сайта или изменении структуры URL

Следует помнить, что при использовании вышеуказанной функции перед тем, как записать их в ваш файл HTACCESS, он проверяет, существуют ли директивы ErrorDocument, но не будет перезаписывать директивы ErrorDocument, если вы измените или переместите свой блог, чтобы отразить обновленные местоположения страниц. Вам нужно будет сначала удалить существующие директивы ErrorDocument в вашем файле HTACCESS, а затем повторно запустить эту функцию, чтобы создать новые директивы.

Правильный крюк, чтобы запустить функцию ТОЛЬКО ОДИН РАЗ

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

Файловые права

Также обязательно, чтобы ваш .htaccess был доступен для записи при использовании вышеуказанной функции, поэтому убедитесь, что он имеет правильные права доступа к файлу, что-то вроде CHMOD777.

Мэтт Роял
источник
Не уверен, как это должно работать, внес изменения вручную в файл .htaccess, но это не работает. Я пытаюсь сделать это на локальном хосте, и это должно быть возможно на локальном хосте, так как у меня есть доступ ко всему, серверу и клиенту. Но почему это не работает?
Соломон Клоссон,
@SolomonClosson, возможно, вы можете попробовать использовать плагин, который я написал для этого, он все сделает за вас и точно следует приведенному выше коду :). Официальный плагин для WordPress.Org
Мэтт Роял
@MattRoyal Функция прекрасно работает, и я использую ее для создания других правил htaccess. Как сделать так, чтобы правила вставлялись в самый верх файла, над правилами wp htaccess по умолчанию, пожалуйста? На данный момент правила добавляются внизу файла htaccess. Спасибо.
lowtechsun
Я не согласен с решением: 1 - ВЫ НЕ ДОЛЖНЫ 777 ничего делать на веб-сервере! Это просто плохая практика в целом и приводит к серьезным дырам в безопасности. 2- Вы добавляете запись файла при каждом запросе на веб-сайт, так как действие по записи создает блокировку файла, позволяя выполнять только одну запись, в то время как вы уменьшаете количество запросов и отвечаете одновременно. 3. Веб-сайт не должен иметь зависимостей от сервера, на котором он работает. Если он будет перенесен в систему, где, например, используется nginx, он перестанет работать должным образом. ... продолжается
Эдуардо Оливейра
4- Есть более чистые способы получения ошибок stackoverflow.com/a/34619308/768516
Эдуардо Оливейра