Apache как найти причину 404 с проигнорированным rewriterule

Apache как найти причину 404 с проигнорированным rewriterule

Итак, у меня есть это

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/префикса. (Нет необходимости в $2and, $3как было изначально.)

Связанный контент