私はnginxを使用しており、これが通常私の解決策です。たぶん、これに似たものがApacheで利用可能です。わからない。
X-Accel-Redirect
nginxでは、プロキシはnginxがリダイレクトすると想定される場所を含むヘッダー付きの応答を返すことができます。たとえば、次のnginxconfigを使用します。
server {
...
location / {
proxy_pass: ...;
}
location /media/secure/ {
internal;
alias ...;
}
}
プロキシパスが返される場合:
X-Accel-Redirect: /media/secure/somefile;
次に、nginxはリクエストをプロキシから/media/secure/
場所にリダイレクトし、静的ファイルを提供します。
そのため、私は通常、Djangoでユーザーを認証してから、そのヘッダーとその場所をファイルに返し、nginxがサービスを提供します。これは、Djangoが静的ファイルを提供する必要がなく、ユーザーがその安全な場所にアクセスすることはできず(internal
ディレクティブのため)、すべてのmimeタイプがnginxで構成されている場合、すべてのファイルが適切に提供されるため、便利です。 。
繰り返しますが、これはnginx用であり、Apache用ではありませんが、Apache用に似たようなものがあるかもしれません。
編集
これは、nginxに上記と同じ設定を使用していることを前提とした単純なDjangoコードスニペットです。このビューは、そのパスが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に追加すると、次のようになります。
url(r'^serve_secure_static/$', 'server_secure_static')
次の方法で安全なファイルをリクエストできます。
http://domain.com/serve_secure_static/?file=path/to/file/here/relative/to/media/secure.css
からファイルを提供します
/media/secure/path/to/file/here/relative/to/media/secure.css