Назад | Перейти на главную страницу

Перенаправить все URL-адреса в корень, кроме / wp-admin и wp-json

Я пытаюсь перенаправить все 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, изображения и любые другие статические ресурсы по-прежнему обслуживались правильно.)

Посмотрим, что делают ваши правила.

  1. Вы включаете механизм перезаписи и устанавливаете базовый URL-адрес для перезаписи для каждого каталога. Все нормально.

    RewriteEngine On
    RewriteBase /
    
  2. Затем вы заявляете, что никакой замены - должно быть сделано для /index.php. Тоже норм.

    RewriteRule ^index\.php$ - [L]
    
  3. Остальные условия приводят к применению правила в последней строке.

    Перенаправление на / выполняется, когда файл или каталог не существует или 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.