Nikita Alexander
Nikita Alexander

Reputation: 567

Serving protected files NGINX and Django

I am trying to serve protected media files with Nginx sendfile and X-Accel-Redirect using Django 2.0. This is my Nginx configuration:

server {
    listen      8000;
    server_name localhost;
    charset     utf-8;
    sendfile    on;

    # Protected media
    location /protected {
        internal;
        alias /Users/username/Documents/sat23/venv/media/;
    }

    # Django static
    location /static {
        alias /Users/username/Documents/sat23/venv/static/;
    }

    # All other requests.
    location / {
        uwsgi_pass  django;
        include     /Users/username/Documents/sat23/venv/uwsgi_params;
    }
}

Then in my urls.py I added a simple view that should serve my media files (I'll configure permissions later):

def serveMedia(request):
    url = request.path.replace('media', 'protected')
    response = HttpResponse('')
    response['X-Accel-Redirect'] = url
    response['Content-Type'] = ''
    return response

urlpatterns += [
    path('/media/', serveMedia, name='protected_media')
]

However whenever I call localhost:8000/media/users/user35.jpg, I just get a Django (not nginx) 404 page, saying that Django tried all the configured paths and it couldn't find the requested one.

So I had a suspicion that my view just doesn't work. I then rewrote it like this:

def serveMedia(request):
    return HttpResponse(content=b'Hello there')

And sure enough it doesn't get called. But I have no idea why. Could someone help me out?

P.S. Any recommendations on configuring nginx conf are also very welcome!

Upvotes: 1

Views: 1253

Answers (1)

AKX
AKX

Reputation: 168843

There are no capturing groups in your Django path call there, so that will only match /media/ verbatim.

You might want to use the old-school url route with a regexp like

urlpatterns += [
    url(r'/media/.+', serveMedia),
]

to capture everything that starts with /media/

Upvotes: 2

Related Questions