2015-01-29 3 views
0

Я хочу создать настройку в apache, где мои медиафайлы разделены с моего кода (для простого управления проектами). Идея, которую я создал, - иметь корневой каталог (/ home/villermen/httpd/root), который содержит весь код (файлы php, файлы css и т. Д.) И медиа-каталог (/ home/villermen/httpd/media), который содержит все нетекстовые файлы.Обслуживание файлов из нескольких корневых каталогов в apache

Выполнение этой установки оказалось сложным. Я пытаюсь использовать mod_rewrite для работы с файлами из медиа-каталога, если они существуют, но пока я пока не добился успеха.

Вот часть моей httpd.conf, в котором я пытаюсь сделать волшебство произойдет:

DocumentRoot /home/villermen/httpd/root 
RewriteEngine on 

<Directory /home/villermen/httpd/root> 
    Order allow,deny 
    Allow from all 
    AllowOverride All 

    #...other magic magoo, including rewriterules that do work 
</Directory> 

<Directory /home/villermen/httpd/media> 
    Order allow,deny 
    Allow from allow 
    AllowOverride All 
</Directory> 

#Serve from media if file exists there 
RewriteCond "/home/villermen/httpd/media%{REQUEST_URI}" -f 
RewriteRule "^/?(.*)$" "/home/villermen/httpd/media/$1" 

Попытка получить доступ к файлу, который существует в папке медиа-прежнему будет бросать 404, я на потеря здесь. Я ничего не вижу?

Я использую apache 2.4 на ubuntu 14.04.

РЕДАКТИРОВАТЬ: Удаление RewriteCond в целом все равно не приведет к какой-либо магии. mod_rewrite должен работать за пределами тегов Directory правильно?

ОБНОВЛЕНИЕ: см. Возможный ответ @ kannan-mohan. В конце концов, я пошел за подход увязывания папку медиа с вебсервера, чтобы это папка, а затем переписывать все, чтобы там:

DocumentRoot /home/villermen/httpd/root 
Alias /media /home/villermen/httpd/media 

<Directory /home/villermen/httpd/root> 
    #Serving files from media if they exists there 
    RewriteCond "/home/villermen/httpd/media%{REQUEST_URI}" -f 
    RewriteRule "^(.*)$" "/media/$1" 
</Directory> 

<Directory /home/villermen/httpd/media> 
    Order allow,deny 
    allow from all 
    AllowOverride All 
</Directory> 

ответ

2

Если я правильно понимаю, что вам нужно, как показано ниже.

  1. http://example.com/media/hello.jpg следует сопоставить /home/villermen/httpd/media/hello.jpg
  2. http://example.com/media/video/world.mp4 следует сопоставить /home/villermen/httpd/media/video/world.mp4
  3. И в случае, если файл не существует в media каталоге, то он должен через HTTP 404 извлечь изображение из каталога root. И так http://example.com/media/video/world.mp4 следует сопоставить /home/villermen/httpd/root/video/world.mp4

В этом случае ниже конфигурации будет достаточно.

<VirtualHost *:80> 
    ServerName example.com 
    DocumentRoot /home/villermen/httpd/root 

    RewriteEngine on 
    RewriteCond "%{DOCUMENT_ROOT}..%{REQUEST_URI}" -f 
    RewriteCond %{REQUEST_URI} .*\.jpg$ [OR] 
    RewriteCond %{REQUEST_URI} .*\.mp4$ 
    RewriteRule (.*) "%{DOCUMENT_ROOT}..$1" [L] 

    RewriteRule /media/(.*) /$1 [L] 

</VirtualHost> 

Для дополнительной Сафти в RewriteCond будет также проверить, если запрашиваемый файл типа jpg или mp4 и только потом переписывают происходит. Дополнительные типы носителей можно добавить, добавив флаг [OR] в конце каждого условия.

+0

Нет, на самом деле то, что я хочу достичь, похоже на это: 'http: // example.com/ hello.jpg' должен отображаться на'/home/villermen/httpd/media/hello.jpg', если он существует, иначе он должен просто загрузиться из документа. ('/ Дома/villermen/HTTPD/корень/hello.jpg'). Простой псевдоним здесь не хватит, так как это не допускает этого пошагового поведения. – Villermen

+0

можно будет хранить каталог 'media' внутри' DocumentRoot'. i.e разместить медиа внутри как '/ home/villermen/httpd/root/media'? потому что правила перезаписи для файлов из «DocumentRoot» будут немного сложнее. –

+0

Ну да, это технически может быть. Но я хочу разделить мои включенные, корневые и медиа-каталоги на одном уровне. – Villermen

Смежные вопросы