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


person Chad Paulson    schedule 12.08.2008    source источник


Ответы (3)


Я считаю, что вам нужно добавить раздел с

<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/, и сервер будет знать, откуда взять файлы.

person Ryan Ahearn    schedule 12.08.2008
comment
Я попробовал псевдоним для каталога вне DocumentRoot без раздела «Каталог», и это сработало... - person Pere; 15.05.2014
comment
@Pere Вам нужно будет предоставить доступ к каталогу за пределами DocumentRoot где-то. Если вам не нужно было явно включать раздел <Directory> для этого каталога, возможно, у вас уже есть раздел <Directory> в другом месте конфигурации, который предоставляет доступ к родительскому каталогу. - person MrWhite; 09.12.2020

Просто чтобы вы знали, почему это правило не работает:

Причина, по которой он не может переписать в /home/other_files/file.html, заключается в том, что mod_rewrite анализирует путь как /home/webroot/home/other_files/file.html, поскольку с точки зрения mod_rewrite предшествующая косая черта эквивалентна корневому каталогу вашего документа /home/webroot.

предложение Райана Ахерна является достойным и, вероятно, маршрут, который вы хотите пройти.

person akdom    schedule 12.08.2008
comment
mod_rewrite анализирует путь как /home/webroot/home/other_files/file.html - Да. Если правило не определено в контексте сервера или виртуального хоста (т. е. не .htaccess), в этом случае оно также примет абсолютный путь к файловой системе. (как корневой URl-путь). - person MrWhite; 12.12.2020

Кредит принадлежит Райану Ахиму, но я собираюсь объяснить это. Я новичок, и даже с ответом Райана мне пришлось поэкспериментировать с несколькими вещами, чтобы получить правильный синтаксис.

Я хотел, чтобы мой DocumentRoot был моим каталогом cakephp. Но затем у меня был трекер ошибок Mantis, который был обычным PHP и поэтому не находился в каталоге cakephp. Файлы ниже у меня работают следующим образом.

http://www.example.com : обслуживается /var/www/cakephp

http://www.example.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>
person Joe C    schedule 12.09.2015
comment
Я собираюсь объяснить это, хотя вам также нужно было бы предоставить доступ к областям (за пределами корня документа), которые являются целью Alias (как это делает Райан в своем ответе, хотя и для Apache 2.2). Возможно, вы сделали это для родительского каталога, хотя было бы предпочтительнее сделать это только для рассматриваемых каталогов. Кроме того, если доступ к /mantisbt осуществляется с нескольких виртуальных хостов, было бы предпочтительнее иметь эти директивы в соответствующей конфигурации виртуального хоста, а не быть глобальными в конфигурации server. - person MrWhite; 12.12.2020