Я пытаюсь перенаправить все 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 есть следующие типы ошибок: File does not exist: [...]/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>
Обратите внимание, что, как и в исходном коде, запрос перенаправляется только при запросе несуществующего файла, даже если этот файл находится за пределами /wp-admin
и /wp-json
Пространство URL. (Предположительно это требуется для того, чтобы 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]
В этом нет ничего плохого. URL http://example.com/wp-json/
и все, что ниже, не соответствует последнему условию и RewriteRule
не применяется.
В 404 Not Found
ошибка - это признак того, что у вас нет /wp-json
вообще. Ошибка (читаемая человеком) в ваших журналах предполагает то же самое. Если бы у вас не было последнего правила, первые два правила несуществующих файлов были бы выполнены, что привело бы к перенаправлению на /
. Последнее правило предотвращает это перенаправление, вызывая 404
.