我使用Vhost通过apache服务我的django。 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作为静态文件提供。如果我猜对了,那么程序就是以下
然后我可以使用`并且将正常工作,就像使用初始媒体文件URL一样。我理解正确吗?我的问题如下:
关于1.激活XSendFile。这应该在我的Vhost标签内的conf文件中完成吗?设置XsendFile足够吗?我应该删除媒体指令的Alias以及媒体文件的部分吗?我希望媒体文件只能由我的视图提供?
还有什么我应该注意的吗?
编辑:我的设置是
<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>
my 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
我的问题是某些媒体文件是正常共享的,有些则不是,并且会出现内部服务器错误
答案 0 :(得分:4)
还要确保在Apache配置文件中设置XSendFilePath,如此
XSendFile on XSendFilePath "//path/to/files/on/disk" <Directory "//path/to/files/on/disk"> Order Deny,Allow Allow from all </Directory>
并在返回响应时将其包含在您的视图中:
响应[&#39; X-Sendfile&#39;] = smart_str(file_path)
并回答你的问题:
答案 1 :(得分:0)
如果有人在使用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>
我以wagi在守护程序模式下运行我的网站(参见docs),我想保护一些以 protected / 上传的媒体文件。因此,我添加了一个<Directory>
指令来阻止对其的访问,然后在我的视图中使用 XSendFile ,该指令还验证用户是否有权访问该文件以提供受保护的文件。>
请注意,我的静态文件和媒体文件托管在网络中已安装的文件夹中(/mnt/
),但这不会引起任何问题。