RewriteRule в родительской папке breaks (.htaccess) - PullRequest
1 голос
/ 10 февраля 2020
# /.htaccess
RewriteEngine on
RewriteBase /
RewriteRule "^([^/]+)/root/(.*)"   "$1/index.php?root=$2"

# /folder/.htaccess
RewriteRule "^sub/(.*)"            "index.php?sub=$1"

Каждая папка RewriteRule работает изолированно:

  • /folder/root/hi => /folder/index.php?root=hi
  • /folder/sub/hello => /folder/index.php?sub=hello

Q: Почему добавление any RewriteRule в подпапку (/folder/.htacces) нарушает одно в сети root (вызывает 404)? Что мне нужно сделать, чтобы создавать правила на разных уровнях?

Я пытался добавить RewriteOptions Inherit(Down), но это не имело никакого эффекта.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вам нужно изменить правило root .htaccess на следующее:

RewriteRule ^([^/]+/)?root/(.*)$ $1index.php?root=$2 [L,QSA]

Это должно сделать начальную часть [^/]+/ необязательным соответствием , чтобы создать то же правило работать с root .htaccess, а также с /folder/.htaccess.

. Затем запишите это в свою folder/.htaccess:

RewriteOptions Inherit
RewriteEngine On

RewriteRule ^sub/(.*)$ index.php?sub=$1 [L,QSA]

RewriteOptions Inherit Унаследуйте все правила и директивы от родительского .htaccess и примените их в дочернем контексте после , применяя все правила, определенные в дочернем .htaccess.

1 голос
/ 10 февраля 2020

Если у вас есть RewriteEngine On в /folder/.htaccess, то директивы mod_rewrite в родительской конфигурации будут полностью переопределены, так как директивы mod_rewrite по умолчанию не наследуются.

Однако, даже если вы включите mod_rewrite наследование, директивы по-прежнему не будут работать, потому что mod_rewrite наследование"фактически копирует" директивы "на месте", как если бы директивы находились в одном файле конфигурации - в той же области видимости (с той же directory-prefix ).

Итак, с RewriteOptions Inherit в файле /folder/.htaccess, директивы эффективно обрабатываются так:

# /folder/.htaccess
RewriteRule "^sub/(.*)"            "index.php?sub=$1"

# Inherited from parent config
RewriteRule "^([^/]+)/root/(.*)"   "$1/index.php?root=$2"

Pattern "^([^/]+)/root/(.*)" просто не будет совпадать, если используется в области действия /folder/.htaccess файла - что происходит при использовании наследования mod_rewrite.

ЕСЛИ директивы /.htaccess (root) всегда наследуется, тогда вы можете изменить директиву root, чтобы прочитать что-то вроде следующего (удаление родительского каталога из правила):

RewriteRule ^root/(.*) index.php?root=$1 [L]

(Да, это соответствует прямой я уже в файле /folder/.htaccess.)

Однако, «проблема» в том, что директива, вероятно, не будет работать, если не унаследовано, как в вашем примере. ЕСЛИ он вам особенно нужен для работы в обоих сценариях ios: при наследовании из файла подкаталога .htaccess и непосредственно из документа - root, затем измените директиву, чтобы сделать родительскую папку необязательной. Например:

RewriteRule ^([^/]+/)?root/(.*) $1index.php?root=$3 [L]

Возможно, вам все равно придется исправить директиву RewriteBase или полностью удалить ее.

Наследование mod_rewrite не так полезно , как в сначала появляется. Директивы, которые, как ожидается, будут унаследованы, обычно должны быть специально написаны, чтобы учесть это.

...