首页 > 解决方案 > django + ngnix,提供媒体文件

问题描述

我直接向您展示我的代码:

我处理ewayApp/media/{stuff}与 django 的链接:

urls.py:

path('ewayApp/media/<str:media_url_1>/<str:media_url_2>/<str:media_url_3>',course.getMedia),

处理程序:

course.py:

def getMedia(request, media_url_1, media_url_2, media_url_3):
    ...some stuff...     
    url = '/protected/' + media_url_1+'/'+media_url_2+'/'+media_url_3
    response['X-Accel-Redirect'] = url
    return response

我肯定会通过这个函数的第一个链接,因为我沿着函数有一些打印。

我的 ngnix 设置:

location ~ / {

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;


    proxy_pass http://127.0.0.1:8080;
}

location  ^~ /protected/ {
    internal;
    alias path/to/media/media/;
}

因此,django 服务器在 127.0.0.1:8080 上运行,ngnix 代理那里的所有请求。访问这些媒体文件时,如果我直接访问链接https://website.com/ewayApp/media/{stuff} ngnix 会返回 404 未找到错误。我检查了媒体是否存储在path/to/media/media/,它们是,但显然在子目录中media_url_1media_url_1...{stuff}

如何解决这个问题?

提前致谢。

编辑:

只是为了告诉你链接是正确的,因为如果我将 django 的调试标志设置为 True,则会显示媒体文件,所以所有内容都存储在正确的位置并且链接也是正确的,但是我无法显示使用这个加速重定向 + ngnix

解决了:

正如 Mh Eftekhari 所建议的,我做了一些与他回答类似的事情,但添加了“^~”,这是我对 ngnix 设置的解决方案:

location  ^~/protected/ {
    internal;

    alias /path/to/media/media;
    try_files $uri $uri/ =404;

}

location ~ / {

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    ##Use the domain.tld here.
    proxy_pass http://127.0.0.1:8080;
}

标签: pythondjangoserverdjango-staticfiles

解决方案


将您的配置更改为此

       location /protected{
                alias path/to/media/media/;
                try_files $uri $uri/ =404;
       }

推荐阅读