Назад | Перейти на главную страницу

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

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

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

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

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

В определенной степени это работает, но, похоже, направляет все в устаревшую папку, а не только тогда, когда файл не существует в первом месте, а существует в устаревшей папке.

Заранее спасибо за любую помощь, Джек.

В вашем черновике первый 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 с слегка разными конфигурациями.)