XsendFile с Apache и Django

Мой django обслуживается Apache с использованием Vhost. Файл conf следующий

WSGIPythonPath /srv/www/myproject/testproject/


<VirtualHost *:80>
    ServerAdmin admin@betarhombus.com
    ServerName www.betarhombus.com
    WSGIScriptAlias / /srv/www/testproject/testproject/testproject/wsgi.py
    <Directory /srv/www/testproject/testproject/testproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    Alias /static/ /srv/www/testproject/testproject/static/
    Alias /media/  /srv/www/testproject/testproject/media/

    <Directory /srv/www/testproject/testproject/static>
        Require all granted
    </Directory>
    <Directory /srv/www/testproject/testproject/media>
        Require all granted
    </Directory>

</VirtualHost>

Я хочу ограничить показ файлов мультимедиа только зарегистрированным пользователям. Поэтому я столкнулся с XsendFile. Если я правильно понимаю, что в то время как у вас есть django, который выполняет всю проверку медиа-файла, который вы хотите обработать, Apache обрабатывает его как статический файл. Таким образом, процедура является следующей, если я угадываю

  1. Активируйте XsendFile.
  2. Создайте представление, которое проверяет разрешения для медиа-файлов и т. Д. И обслуживает их
  3. ассоциировать с URL в файле urls.py

Тогда я могу использовать `и будет работать нормально, как если бы он был обработан с использованием исходного URL-адреса медиа-файла. Я правильно понимаю? Мои вопросы следующие:

О 1.активации XSendFile. Должно ли это быть сделано в файле conf внутри моего тега Vhost? Достаточно ли установить XsendFile? Должен ли я удалить директиву Alias ​​for media, а также раздел для медиафайлов? Я хочу, чтобы медиа-файлы обслуживались только моим видом?

Есть ли что-то еще, что я должен знать?

Изменить: Моя настройка

 <VirtualHost *:80>
    ServerAdmin admin@betarhombus.com
    ServerName www.betarhombus.com
    WSGIScriptAlias / /srv/www/testproject/testproject/testproject/wsgi.py
    XSendFile On
    XsendFilePath /srv/www/testproject/testproject/media/
    <Directory /srv/www/testproject/testproject/testproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    Alias /static/ /srv/www/testproject/testproject/static/
    <Directory /srv/www/testproject/testproject/static>
        Require all granted
    </Directory>
</VirtualHost>

мой urls.py

#for xsendmedia file serving
url(r'^media\/(?P<path>.*)$', 'customer.views.media_xsendfile'),

и мой взгляд

def media_xsendfile(request, path):  
    #here will be checked if user can access media
    response = HttpResponse()
    response['Content-Type']=''
    response['X-Sendfile']= smart_str(os.path.join(settings.MEDIA_ROOT, path))
    return response

Моя проблема заключается в том, что некоторые файлы мультимедиа являются общими, а некоторые нет, и получают внутреннюю ошибку сервера

2 ответа

Решение

Также убедитесь, что XSendFilePath установлен в вашем конфигурационном файле Apache следующим образом:

XSendFile on
XSendFilePath "//path/to/files/on/disk"
<Directory "//path/to/files/on/disk">
    Order Deny,Allow
    Allow from all
</Directory>

и включите это в ваш взгляд при возврате ответа:

response ['X-Sendfile'] = smart_str (file_path)

И ответить на ваши вопросы:

  • Активируйте XSendFile в теге vhost
  • Я написал выше, что еще нужно сделать в представлении
  • Я не уверен, стоит ли удалять псевдоним мультимедиа, файлы журнала должны сообщать вам о наличии проблем

Если кто-то сталкивается с той же проблемой с более новой версией Apache (2.4), вот как мне наконец удалось заставить ее работать:

      <VirtualHost *:80>
        XSendFile on
        
        Alias /static/ /mnt/mysite/static/
        Alias /media/ /mnt/mysite/media/

        <Directory /mnt/mysite/static>
                Require all granted
        </Directory>

        <Directory /mnt/mysite/media>
                Require all granted
        </Directory>

        <Directory /mnt/mysite/media/protected>
                Require all denied
        </Directory>
        XSendFilePath /mnt/mysite/media/protected

        <Directory /home/benbb96/mysite>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess mysite python-home=/home/benbb96/mysite/venv python-path=/home/benbb96/mysite/
        WSGIScriptAlias / /home/benbb96/mysite/config/wsgi.py
</VirtualHost>

Я запускаю свой сайт с помощью wsgi в режиме демона (см . документы ), и я хотел защитить некоторые медиафайлы, которые загружаются в защищенный/ . Поэтому я добавил <Directory>чтобы заблокировать доступ к нему, а затем я использую XSendFile , на мой взгляд, который также проверяет, есть ли у пользователя доступ к файлу, для обслуживания защищенного файла.

Обратите внимание, что мои статические и медиафайлы размещены в смонтированной папке из сети ( /mnt/), но это не вызывает никаких проблем.

Другие вопросы по тегам