Как переписать использование htaccess, если файл существует в другой папке?

Мы пытаемся переписать к другой папке, если файл не существует в корне документа, но действительно существует в другой папке.

Другая папка находится в совершенно другом месте, которое расположено с помощью "Псевдонима" в vhosts.

Так, что мы имеем до сих пор (из этого сообщения, Как переписать URI от корня, если файл существует в папке?):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/legacy/
RewriteRule ^(.*)$ legacy/$1 [QSA,L]

Это работает до степени, но, кажется, направляет все к папке прежней версии, не как раз в то самое время, когда файл не существует в первом месте и действительно существует в наследии.

Заранее спасибо за любую справку, Jack.

1
задан 13 April 2017 в 15:14
1 ответ

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

Такая простая вещь кажется удивительно сложной для реализации. Лучшее, что я смог найти (надеюсь, кто-то другой будет знать лучше):

# parse the current local filename into parts we can manipulate
# (weird construct and regex in first RewriteCond are because 
#  mod_rewrite never does any variable substitution on the righthand side)
RewriteCond %{DOCUMENT_ROOT},%{REQUEST_FILENAME} ^([^,]*),\1/*(.*)/+(.*)$
RewriteRule ^ - [E=CURPATH:/%2,E=CURNAME:%3]

# allow direct access to the alternate folder
#  (omit this entire ruleset if that's not desired)
RewriteCond %{ENV:CURPATH} !^/*legacy(?:/|$)
RewriteRule ^ - [L]

# do the checks and make the change if necessary
RewriteCond %{DOCUMENT_ROOT}/%{ENV:CURPATH}/%{ENV:CURNAME} !-f
RewriteCond %{DOCUMENT_ROOT}/legacy/%{ENV:CURPATH}/%{ENV:CURNAME} -f
RewriteRule ^ /legacy/%{ENV:CURPATH}/%{ENV:CURNAME} [L]

(Обратите внимание, что это немного больше, чем просто решение вашей заявленной проблемы. Он также пытается быть более общим: работает во всех подкаталогах, работает даже с косыми чертами дублируются и работают на разных Apache с несколько разными конфигурациями.)

0
ответ дан 4 December 2019 в 08:58

Теги

Похожие вопросы