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 обрабатывает его как статический файл. Таким образом, процедура является следующей, если я угадываю
- Активируйте XsendFile.
- Создайте представление, которое проверяет разрешения для медиа-файлов и т. Д. И обслуживает их
- ассоциировать с 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/
), но это не вызывает никаких проблем.