Вопрос или проблема
Я загрузил страницы html 403 и 404 в директорию своей темы WordPress, и если я попытаюсь открыть случайную ошибку после .com, например .com/yyyy, то загружается страница 404, так что все в порядке…
Однако… я хотел бы, чтобы 403.php отображалась, когда кто-то вне моего разрешенного IP-адреса пытается получить доступ к странице входа.
Это правило .htaccess работает отлично, НО оно создает бесконечный цикл, так как WordPress пытается найти страницу 403.php…
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^111\.111\.22\.33$
RewriteRule ^(.*)$ - [R=403,L]
</IfModule>
Таким образом, вы можете увидеть в последней строке, что есть R=403, который пытается найти страницу 403, но не может ее найти…
Я поэтому добавил следующие строки (пробуя одну за другой), но они не сработали:
ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
А затем я попробовал
ErrorDocument 403 /index.php?error=403
ErrorDocument 404 /index.php?error=404
И никакого результата…
Должны ли шаблоны 403 и 404 содержать специфический для WordPress php в верхней части шаблона?
Или – как мне правильно вызвать 403.php, когда пользователь БЕЗ правильного IP-адреса пытается получить доступ к странице входа?
Спасибо!
это создает бесконечный цикл, так как WordPress пытается найти страницу 403.php
Не WordPress, а Apache. WordPress вообще не видит запрос.
Вам нужно создать исключение для вашего собственного документа об ошибке 403, в противном случае директивы, которые вы указали, будет выдавать еще одну ошибку 403 для самого документа об ошибке… бесконечный цикл.
Если ваш ErrorDocument
определен вот так:
ErrorDocument 403 /403.php
Тогда вы можете либо создать исключение до ваших существующих правил вот так:
RewriteRule ^403\.php$ - [L]
Что фактически инструктирует mod_rewrite/Apache ничего не делать, когда запрашивается документ /403.php
.
Или объединить это в ваш существующий блок правил. Например:
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^111\.111\.22\.33$
RewriteRule !^403\.php$ - [R=403,L]
Префикс !
на RewriteRule
шаблоне отменяет регулярное выражение. Таким образом, этот блок правил будет обработан только в том случае, если документ /403.php
не запрашивается. Обратите внимание, что [R=403,L]
то же самое, что [F]
.
Или вы можете просто отключить ваш собственный документ об ошибке и использовать стандартный ответ об ошибке от Apache:
ErrorDocument 403 default
-
WordPress имеет встроенные шаблоны для 404 и 403, они называются 404.php и 403.php в вашем шаблоне.
-
ИЛИ вы также можете определить, какая страница / действие будет загружаться, когда отправляется указанный код ошибки, поместите это в файл functions.php:
function detect_response_header(){
if (http_response_code() == 403) {
// выполните действие здесь, включите файл шаблона, перенаправьте на внешний wordpress окружение (файл, который не связан с WordPress на вашем сайте) иличто-то еще
}
}
add_action('template_redirect','detect_response_header');
Источник:
https://codex.wordpress.org/Plugin_API/Action_Reference/init
Ответ или решение
Для реализации корректного отображения страницы 403 при попытке доступа к вашим защищённым ресурсам WordPress необходимо внести изменения в файл .htaccess
, который управляет поведением сервера Apache. Ваша текущая конфигурация вызывает бесконечный цикл, так как Apache пытается отобразить свой собственный документ 403, который также попадает под ваше правило доступа.
Шаг 1. Исключение для 403.php
Для решения проблемы существует простой подход: добавьте исключение для вашего документа 403. Это можно сделать несколькими способами.
Первый способ:
Добавьте правило перед вашими существующими правилами, которое будет обрабатывать запросы к документу 403.php
:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^403\.php$ - [L]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^111\.111\.22\.33$
RewriteRule ^(.*)$ - [R=403,L]
</IfModule>
Второй способ:
Вместо этого вы можете интегрировать исключение в ваше существующее правило:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^111\.111\.22\.33$
RewriteRule !^403\.php$ - [R=403,L]
</IfModule>
Значение !
перед именем файла в условии означает, что правило будет применяться только если запрашиваемый URL не является 403.php
.
Шаг 2. Настройка документов ошибок
Если вы хотите настроить свои собственные страницы ошибок 403 и 404, убедитесь, что у вас есть соответствующие файлы 403.php
и 404.php
в каталоге вашей темы. Кроме того, вам не нужно добавлять строчки с ErrorDocument
, если у вас уже есть правило для 403:
ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
Шаг 3. Унификация с WordPress
Кроме того, возможно использование встроенной функциональности WordPress для обработки ошибок. В файл functions.php
вашей темы можно добавить код, который будет определять ошибку и выполнять соответствующие действия:
function detect_response_header(){
if (http_response_code() == 403) {
// Подключите файл шаблона или перенаправьте на другую страницу
include get_template_directory() . '/403.php';
exit;
}
}
add_action('template_redirect', 'detect_response_header');
Это позволит подключить ваш файл шаблона для отображения специального контента при ошибке 403, сохраняя при этом управление через WordPress.
Заключение
Внедрив вышеуказанные изменения, вы сможете успешно отобразить страницу 403 для пользователей, не имеющих разрешения на доступ к вашему логину и административной панели. Убедитесь, что данный код проверен на работоспособность и безопасен, чтобы избежать нежелательных последствий. Правильное использование исключений и обработка ошибок поможет предотвратить зацикливание запросов на ваш сервер и повысить безопасность вашего сайта.