Я пытаюсь перенаправить все URL-адреса в корневой каталог, за исключением администрирования wordpress и REST API wordpress.
У меня есть эти правила в моем .htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin.*
RewriteCond %{REQUEST_URI} !^/wp-json.*
RewriteRule ^.*$ / [L,R=301]
</IfModule>
Работает отлично для всех перенаправлений, ожидаемых для маршрута / wp-json
, где я получаю ошибку 404.
Кроме того, в моем файле журнала apache есть следующие типы ошибок:
Файл не существует: [...] / dmjob / wp-json, referer: http://dmjob.dev:8888/
Не могли бы вы мне помочь? Большое спасибо ! :)
Кажется, что уничтожен фронт-контроллер WordPress, поэтому любые запросы к /wp-admin
и /wp-json
будут неправильно маршрутизированы (отсюда и 404-е, что вы видите).
Вы должны оставить директивы WP как есть, но реализовать дополнительный редирект в начале файла. Например:
# Redirect all requests for non-existent files and those not for wp-admin or wp-json
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin
RewriteCond %{REQUEST_URI} !^/wp-json
RewriteRule ^ / [R=301,L]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Обратите внимание, что, как и в вашем оригинальном коде, запрос перенаправляется только при запросе несуществующего файла, даже если этот файл находится за пределами URL пространства /wp-admin
и /wp-json
. (Предположительно, это необходимо для того, чтобы CSS, JS, изображения и любые другие статические ресурсы по-прежнему обслуживались корректно)
Посмотрим, что делают ваши правила.
Вы включаете механизм переписывания, устанавливающий базовый URL для переписывания каждого каталога. Ничего страшного.
RewriteEngine On
RewriteBase /
Затем вы заявляете, что для /index.php
не должна производиться никакая субституция -
. Это тоже нормально.
RewriteRule ^index\.php$ - [L]
Остальные условия приводят к применению правила в последней строке.
Переадресация на /
осуществляется, когда файла или каталога не существует или URL запроса не является /wp-admin.*
или /wp-json.*
:
RewriteCond %{REQUEST_FILENAME}. !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin.*
RewriteCond %{REQUEST_URI} !^/wp-json.*
RewriteRule ^.*$ / [L,R=301]
Нет ничего плохого ни в одном из них. Урл http://example.com/wp-json/
и все, что находится под ним, не отвечает последнему условию, а RewriteRule
не применяется.
Ошибка 404 Not Found
является признаком того, что у вас вообще нет /wp-json
. Ошибка (читаемая человеком) в ваших журналах говорит об одном и том же. Если бы у вас не было последнего правила, первые два правила несуществующих файлов были бы выполнены, что привело бы к перенаправлению на /
. Наличие последнего правила предотвращает это перенаправление, вызывая 404
.