Мод-Переписать загружаемые файлы за DocumentRoot

StackOverflow https://stackoverflow.com/questions/8441

  •  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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top