Django和Nginx X-accel-redirect

时间:2017-08-24 23:55:44

标签: django ubuntu nginx sendfile django-media

到目前为止,我一直在试图保护Django的媒体文件,并且没有运气!我只是想让它只在管理员用户可以访问媒体文件夹的地方。这是我的Nginx文件。

server {
    listen 80;
    server_name xxxxxxxxxx;

    location = /favicon.ico {access_log off; log_not_found off;}
    location /static/ {
          alias /home/{site-name}/static_cdn/;
   }
   location /media/ {
          internal;
          root /home/{site-name}/;
   }

   location / {
this is setup and working. Didn't include Code though

}

我的网址文件

urlpatterns = [
    url(r'^media/', views.protectedMedia, name="protect_media"),
] 

我的观点

def protectedMedia(request):

    if request.user.is_staff:
        response = HttpResponse()
        response['Content-Type'] = ''
        response['X-Accel-Redirect'] = request.path
        return response

    else:
        return HttpResponse(status=400)

这产生了404 Not Found Nginx错误。这里看起来有什么明显的错误吗?谢谢!

顺便说一句,我已经尝试在Nginx设置中将/ media /添加到根URL的末尾。

2 个答案:

答案 0 :(得分:3)

这就是@Paulo Almeida解决这个问题的原因。

在nginx文件中,我改变了我以前所拥有的......

   location /protectedMedia/ {
          internal;
          root /home/{site-name}/;
   }

我的网址是......

url(r'^media/', views.protectedMedia, name="protect_media"),

视图是......

def protectedMedia(request):

    if request.user.is_staff:
        response = HttpResponse(status=200)
        response['Content-Type'] = ''
        response['X-Accel-Redirect'] = '/protectedMedia/' + request.path
        return response

    else:
        return HttpResponse(status=400)

这完美无缺!现在只有管理员用户可以访问存储在我的媒体文件夹中的媒体文件。

答案 1 :(得分:3)

这对我有很大帮助,只需进行少量的更新和修改即可

urls.py:

skip

views.py:

re_path(r'^media/', protectedMedia, name="protect_media")

我必须将nginx配置更改为以下内容:

from django.http import HttpResponse
from django.contrib.admin.views.decorators import staff_member_required


@staff_member_required
def protectedMedia(request):
    response = HttpResponse(status=200)
    response["Content-Type"] = ''
    response['X-Accel-Redirect'] = '/protectedMedia/' + request.path
    return response

注意:

  • 我更喜欢使用装饰器,因为它会自动重定向到登录页面(在设置中指定时)并设置“下一个”页面。
  • url()得到deprecated in Django 3.1,所以只需使用 re_path()
  • 在nginx配置中使用别名而不是root:我不想在URL中显示“ / protectedMedia /”(并且不起作用),另请参见nginx docs

如果您仍然停留在某个地方,这会给我提供更多的背景信息:https://wellfire.co/learn/nginx-django-x-accel-redirects/