
Итак, у меня есть это
RewriteCond %{REQUEST_URI} (da-dk)/(.*)(/|\.php)$
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]
Но по каким-то причинам example.com/da-dk/ выдает "404 - не найдено"
Я хотел бы попытаться понять, почему Apache пришел к такому выводу, т.е. с какими правилами он столкнулся и каким правилам следовал.
решение1
Предположим, что это в корневом .htaccess
файле...
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]
Запрос /da-dk/
(который соответствует URL-пути da-dk/
) не соответствует регулярному выражению, ^(da-dk)/(.*)(/|\.php)$
поэтому это правило не обрабатывается/не соблюдается.
Итак, если у вас нет других правил, соответствующих этому запросу, тонетправила соблюдаются, отсюда и 404. (Что касается того, какие правила «встречаются», ну, все остальные правила, которые у вас есть,столкнулись.)
Кстати, предыдущеесостояние( RewriteCond
директива) здесь совершенно излишняя и должна быть удалена. Она не делает ничего, кроме того, чтоRewriteRule
шаблонуже установлено.
В частности, это правило (регулярное выражение) будет соответствовать URL-адресам следующего вида:
/da-dk/.php
/da-dk/<foo>/
/da-dk/<foo>.php
/da-dk/<foo>/<bar>/<baz>/
/da-dk/<foo>/<bar>/<baz>.php
Не совпадает:
/da-dk/<foo>
/da-dk/
Это правило просто удаляет /da-dk
префикс в запрошенном URL-адресе (предположительно, внадеятьсячто перезаписанный URL соответствует каталогу или файлу файловой системы).
Если /da-dk/
должно быть переписано обратно в корень, то приведенное выше правило может быть изменено, чтобы учесть это (в процессе его также можно немного упростить). Например, попробуйте следующее вместо этого:
RewriteRule ^da-dk/(.+(/|\.php))?$ /$1 [L]
Здесь часть URL-пути после da-dk/
сделананеобязательный. (В этом случае $1
обратная ссылка фактическипустой.)
Изменение квантификатора с *
на +
также позволяет избежать сопоставления (бессмысленного) URL-адреса /da-dk/.php
.
Не нужнозахватыватьчасть da-dk
(первый сегмент пути), так как он не используется взаменастрока (2-й аргумент).
Обратная $1
ссылка теперь содержит весь URL-путь после da-dk/
префикса. (Нет необходимости в $2
and, $3
как было изначально.)