Я заметил, что некоторые подпапки имеют свои собственные .htaccess
файлы, нужно ли помещать правило перенаправления в подпапку .htaccess
файлов?
Любые директивы mod_rewrite в дочерних .htaccess
файлах по умолчанию полностью переопределяют директивы mod_rewrite в любом родительском .htaccess
файле, они не наследуются . Однако вы можете изменить это поведение. В Apache 2.2 это довольно ограничено, так как вам все равно придется изменить дочерний файл .htaccess
, поэтому, вероятно, будет проще просто продублировать эту директиву в дочернем конфиге. Но на Apache 2.4.8+ вы можете сделать все это в родительском файле .htaccess
. Например:
RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{REQUEST_URI} !^/other
RewriteRule ^[^/]+/login$ /other/login [R=302,L]
Опция InheritDownBefore
приводит к тому, что текущие директивы mod_rewrite применяются перед директивами mod_rewrite в любых дочерних конфигурациях.
Директива RewriteCond
необходима для предотвращения цикла перенаправления (если подкаталог /other
не имеет своего собственного .htaccess
файла, содержащего директивы mod_rewrite).
Это внешнее «перенаправление» (как указано в вашем вопросе). URL-адрес изменяется в адресной строке браузера. Вы можете изменить это значение на внутреннее переписывание (как подразумевает текущая директива), удалив флаг R
(хотя это может зависеть от вашего приложения).
Если вы просто хотите «перенаправить», то, возможно, вы могли бы использовать директиву mod_alias RedirectMatch
вместо вышеуказанных директив mod_rewrite. Это работает отдельно от mod_rewrite, но обратите внимание, что любые директивы mod_rewrite (в дочерних конфигурациях) обрабатываются первыми. Например:
RedirectMatch 302 ^/(?!other)[^/]+/login$ /other/login
Директива RedirectMatch
использует регулярное выражение, тогда как Redirect
(также mod_alias) использует простое сопоставление префиксов. Таким образом, вы не можете сопоставить этот конкретный шаблон , используя просто Redirect
.
Часть (?!other)
представляет собой отрицательный запрос (утверждение нулевой ширины), который проверяет, что сопоставляемый URL-путь не запускается other
- во избежание цикла перенаправления.
Обратите внимание, что RewriteRule
не использует префикс косой черты в URL-пути, тогда как RedirectMatch
-. И нет необходимости записывать URL-путь (т. Е. Заключая регулярное выражение в скобки), если это не требуется.