Перенаправить все 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 есть следующие типы ошибок: Файл не существует: [...] / dmjob / wp-json, referer: http://dmjob.dev:8888/

Не могли бы вы мне помочь? Большое спасибо ! :)

6
задан 31 May 2017 в 13:08
2 ответа

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

.
4
ответ дан 3 December 2019 в 00:35

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

  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]
    

Нет ничего плохого ни в одном из них. Урл http://example.com/wp-json/ и все, что находится под ним, не отвечает последнему условию, а RewriteRule не применяется.

Ошибка 404 Not Found является признаком того, что у вас вообще нет /wp-json. Ошибка (читаемая человеком) в ваших журналах говорит об одном и том же. Если бы у вас не было последнего правила, первые два правила несуществующих файлов были бы выполнены, что привело бы к перенаправлению на /. Наличие последнего правила предотвращает это перенаправление, вызывая 404.

.
0
ответ дан 3 December 2019 в 00:35

Теги

Похожие вопросы