我使用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