.htaccess перенаправить все подпапки по определенному пути - PullRequest
0 голосов
/ 27 октября 2018

У меня есть несколько сайтов (подкаталогов). Я хочу перенаправить все URL-адреса в формате /(*)/login на /other/login.

Я пробовал:

RewriteRule ^/(.*)/login /other/login
#and 
^(.*)/login /other/login

Я тоже пробовал Redirect.

Кроме того, я заметил, что некоторые подпапки также имеют свои собственные .htaccess файлы. Нужно ли помещать правило перенаправления в файл .htaccess подпапки? Там наверняка должен быть более эффективный способ.

1 Ответ

0 голосов
/ 27 октября 2018

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

...