Потому что, поскольку перенаправление безусловный, вы снова перенаправляете после URL был переписан на index.php
(фронт-контроллер WordPress).
Когда вы запрашиваете /somepage.php
:
- Вы перенаправлены на
/некоторая страница
(по первому правилу). Ответ перенаправления отправляется обратно клиенту.
- По второму запросу,
/некоторая страница
внутренне переписан на /index.php
по последнему правилу. Затем механизм перезаписи запускается заново (в каталог контекст)...
/index.php
перенаправляется на /показатель
(по первому правилу).Ответ перенаправления отправляется обратно клиенту.
- По третьему запросу
/показатель
внутренне переписан на /index.php
по последней перезаписи. Затем двигатель перезаписи запускается заново...
- Перейти к 3 (застрял в бесконечном цикле перенаправления).
В каталог контекст (как .htaccess
) механизм перезаписи не просто выполняет один проход по сценарию. Он повторяется до тех пор, пока URL-адрес не пройдет без изменений. (Если вы не используете КОНЕЦ
флаг на Apache 2.4, или происходит внешнее перенаправление 3xx.)
Изменение для удаления .html
работает нормально, потому что вы переписываете на /index.php
, который не заканчивается .html
, поэтому директива перенаправления (которая удаляет .html
) не совпадает.
Чтобы решить эту проблему, вам нужно избегать перенаправления переписанного запроса. Вы можете сделать это либо:
с использованием КОНЕЦ
флаг (Apache 2.4+) при последней перезаписи вместо л
чтобы предотвратить дальнейшие циклы механизма перезаписи. Хотя вам следует избегать изменения стандартных директив WordPress (см. ниже), так что это может быть не предпочтительным вариантом. Это также не работает на Apache 2.2.
Или проверьте наличие .php
продление против ЗАПРОС
серверная переменная (которая содержит начальную строку заголовков HTTP-запроса и не изменяется при перезаписи запроса). Например:
# Удалить расширение ".php" только для "прямых" (не переписанных) запросов
RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC]
Правило перезаписи (.+)\.php$ /$1 [R=301,L,NC]
Или проверьте REDIRECT_STATUS
переменная окружения, которая пуста при первоначальном запросе и устанавливается в 200 (как в HTTP-статусе 200 OK) при первой успешной перезаписи (это проще, чем более сложное регулярное выражение выше). Например:
# Удалить расширение ".php" только для "прямых" (не переписанных) запросов
Условия перезаписи %{ENV:REDIRECT_STATUS} ^$
Правило перезаписи (.+)\.php$ /$1 [R=301,L,NC]
Однако не следует редактировать код внутри # НАЧАТЬ WordPress
раздел, так как сам WordPress пытается поддерживать его и может перезаписать этот код позже. Это правило должно пройти перед в # НАЧАТЬ WordPress
маркер комментария. Вам не нужно повторять RewriteEngine включен
директива, которая появляется позже в файле (в разделе WordPress).
Вам нужно будет очистить кеш браузера перед тестированием, так как ошибочное (постоянное) перенаправление, скорее всего, будет кешировано браузером. Сначала проверьте с 301 (временной) переадресацией, чтобы избежать проблем с кэшированием.
Однако это само по себе не позволяет вам получить доступ .php
файлы без .php
расширение. Поскольку URL-адрес без расширения необходимо будет внутренне переписать обратно в .php
файл.