Mod-Rewrite загружает файлы за DocumentRoot
Я использую .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? Если да, может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
Я считаю, что вам нужно добавить раздел с
<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/, и сервер будет знать, откуда взять файлы.
Ответ 2
Просто, чтобы вы знали, почему это правило не работает:
Причина, по которой он не может переписать на /home/other\_files/file.html
, заключается в том, что mod_rewrite анализирует путь как /home/webroot/home/other\_files/file.html
, поскольку с точки зрения mod_rewrite предыдущая косая черта эквивалентна корню вашего документа /home/webroot
.
Предложение Ryan Ahearn является достойным, и, скорее всего, маршрут, по которому вы хотите пойти.
Ответ 3
Кредит принадлежит Райану Эйхэму, но я собираюсь описать его. Я новичок и даже с ответом Райана, мне пришлось поэкспериментировать с несколькими вещами, чтобы правильно получить синтаксис.
Я хотел, чтобы мой DocumentRoot был моим каталогом cakephp. Но тогда у меня был трекер Mantis Bug, который был просто регулярным 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 [email protected]_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>