Подтвердить что ты не робот

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? Если да, может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 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>