我使用nginx,这通常是我的解决方案。也许类似这样的东西可以用于Apache。不知道。
在nginx的,代理可以返回与头X-Accel-Redirect
的响应与该位置到nginx的是假设重定向。例如用下面的nginx的配置:
server {
...
location/{
proxy_pass: ...;
}
location /media/secure/ {
internal;
alias ...;
}
}
如果代理通将返回:
X-Accel-Redirect: /media/secure/somefile;
然后nginx的会从代理请求重定向到/media/secure/
位置,从而服务于静态文件。
所以我通常在Django验证用户身份,然后就返回头与位置,然后nginx的提供文件。这很好,因为Django不必提供静态文件,用户不能只访问安全位置(因为internal
指令),并且因为如果在nginx中配置了所有MIME类型,则所有文件都可以正常服务。 ..
同样,这是为nginx,而不是为Apache,但也许有类似的东西在那里为Apache。
编辑
下面是一个简单的Django代码片段假设你使用相同的设置上面nginx的。这种观点提供安全的文件,如果在GET提供它的路径:
@login_required()
def serve_secure_static(request, file_root=os.path.join(settings.MEDIA_ROOT, 'secure')):
if not request.method == 'GET':
return HttpResponseBadRequest('Only GET allowed')
if not 'file' in request.GET:
return HttpResponseBadRequest('File query must be provided')
# make sire loggen user is allowed to see the file
# maybe check some custom permission
file_path = request.GET['file']
# if in DEBUG, make Django serve static file
# because nginx might not be configured
if settings.DEBUG:
abs_file_path = os.path.join(file_root, file_path)
file_data = open(abs_file_path, 'rb').read()
return HttpResponse(file_data, mimetype=mimetypes.guess_type(file_path))
# else make nginx serve static file
else:
redirect_url = '/%s' % file_path
response = HttpResponse()
response['X-Accel-Redirect'] = redirect_url
return response
所以,如果添加此视图urlconfig则:
http://domain.com/serve_secure_static/?file=path/to/file/here/relative/to/media/secure.css
:
url(r'^serve_secure_static/$', 'server_secure_static')
您可以通过申请安全文件
这将服务从
/media/secure/path/to/file/here/relative/to/media/secure.css
我相信这是Apache的x-sendfile所做的。如果没有现有的软件包,我可能会尝试你的解决方案,做我想要的。 –
你有适合Django代码的代码片段吗? –
更新了答案 – miki725