Мод-Переписать загружаемые файлы за DocumentRoot
-
08-06-2019 - |
Вопрос
Я использую .htaccess
и mod_rewrite
указывать на файлы, которые находятся за DocumentRoot.Моя структура папок выглядит следующим образом:
home/
webroot/
other_files/
У меня есть .htaccess
файл в webroot со следующим содержимым:
RewriteEngine on RewriteRule ^(.*)$ /home/other_files/$1
Если я попытаюсь получить доступ http://example.com/file.html Я получаю следующую ошибку:
Запрошенный URL /home/other_files/file.html не был найден на этом сервере.
Возможно ли вообще загружать файлы, которые находятся за DocumentRoot?Если да, то может ли кто-нибудь указать мне правильное направление?
Решение
Я считаю, что вам нужно добавить раздел с
<Directory "/home/other_files">
(options)
</Directory>
к конфигурации вашего сервера, прежде чем apache сможет обслуживать что-либо с него.Например, мой DocumentRoot - это /var/www, но на доступном сайте по умолчанию есть этот раздел:
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
Затем вы могли бы переписать URL-адрес, чтобы перейти в /doc/, и сервер знал бы, откуда брать файлы.
Другие советы
Просто чтобы вы знали, почему это правило не работает:
Причина, по которой он не может быть переписан на /home/other\_files/file.html
заключается в том, что mod_rewrite анализирует путь как /home/webroot/home/other\_files/file.html
поскольку с точки зрения mod_rewrite предыдущая косая черта эквивалентна корню вашего документа /home/webroot
.
Предложение Райана Ахерна это достойный вариант, и, скорее всего, это тот маршрут, которым вы хотите пойти.
Заслуга в этом принадлежит Райану Ахиму, но я собираюсь изложить это по буквам.Я новичок, и даже с ответом Райана мне пришлось поэкспериментировать с несколькими вещами, чтобы получить правильный синтаксис.
Я хотел, чтобы моим DocumentRoot был мой каталог cakephp.Но потом у меня появился баг-трекер Mantis, который был обычным php и поэтому отсутствовал в каталоге cakephp.В приведенных ниже файлах у меня работает следующее.
http://www.my_website.com :обслуживается /var/www/cakephp
http://www.my_website.com/mantisbt :обслуживается /var/www/html/mantisbt
Файл /etc/httpd/conf/httpd.conf
Alias /mantisbt/ "/var/www/html/mantisbt/"
<Directory "/var/www/html/">
AllowOverride All
</Directory>
<VirtualHost *:80>
ServerAdmin me@my_email.com
DocumentRoot /var/www/cakephp
ServerName my_website.com
<Directory /var/www/cakephp/>
AllowOverride All
</Directory>
</VirtualHost>
Файл /var/www/cakephp/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^mantisbt/?$ /mantisbt/ [NC,L]
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>