htaccess: действует так, как если бы файлы находились в другом каталоге, но RewriteRules кажутся взаимоисключающими - PullRequest
1 голос
/ 09 апреля 2019

Для файлов в нескольких подкаталогах /data/ я хотел бы рассматривать их (и файлы внутри них) так, как если бы они находились в корневом каталоге.

Итак,

1) запрос к

/data/foobar/file.png

должен перенаправить браузер на

/foobar/file.png

2) любые запросы к

/foobar/file.png

должен соответственно доставить файл /data/foobar/file.png, но без перенаправления.


Для 1) У меня работает следующее правило:
RewriteCond %{REQUEST_URI} ^(.*)?data/((foobar|and|some|other|subdirs)/.*)$
RewriteRule .* %1%2 [R=301,L,qsappend]

(я выбрал этот подход, используя RewriteCond с %x ссылками, чтобыподкаталог-независимый, как и в моей среде разработки, страница расположена в подкаталоге, а не в действующей системе, где она находится в корне домена.)

и для 2) Следующее правило помогает:

RewriteRule ^((foobar|and|some|other|subdirs)/.*)$ data/$1 [L,qsappend]

Однако эти правила работают, только если я включаю по одному.Если я включу их обоих одновременно, браузер прервет запрос с ошибкой «слишком много перенаправлений».Перенаправление с /data/* на /* будет работать, но затем завершится прерванным запросом, точно так же, как вызов URL без /data/*.

Мне трудно понять, почему это происходит,Было бы совершенно логично, если бы оба правила фактически вызвали перенаправление.Но что касается моего понимания htacccess (и вкладка Network консоли dev, кажется, подтверждает эту концепцию), клиент даже не должен знать для случая 2), что файл на самом деле не существует.Так почему же это все еще учитывается в пределе перенаправления?

Есть ли что-то фундаментальное, что я упускаю?И как мне достичь того, чего я пытаюсь достичь?

1 Ответ

1 голос
/ 09 апреля 2019

Это потому, что вы сначала перенаправляете, а затем переписываете тот же Uri. Ваше второе правило противоречит первому. Вам нужно сопоставить %{THE_REQUEST} вместо %{REQUEST_URI}, чтобы избежать цикла перенаправления

RewriteCond %{THE_REQUEST} \s(.*)?data/((foobar|and|some|other|subdirs)/.*)\s
RewriteRule .* %1%2 [R=301,L,qsappend]
RewriteRule ^((foobar|and|some|other|subdirs)/.*)$ data/$1 [L,qsappend]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...