X-Accel-Redirect功能不适用于外部连接(在docker网络内部)

时间:2019-03-02 17:05:44

标签: django nginx x-accel-redirect

我正试图允许具有django的容器管理对使用nginx从另一个容器提供的媒体文件的访问。因此,尽管有nginx文档,但我还是从位置配置中删除了internal行:

server {
    server_name nginx; //name of the container used for accessing from another containers
    charset UTF-8;
    client_max_body_size 32m;
    listen 80;

    location /protected/media/ {
        // internal;
        alias /data/djan,go/media/;
    }
}

通过此配置,我可以使用django容器中的/ protected / media url,因此我成功地使用django从容器的外壳中完成了wget http://nginx/protected/media/images/bank_credentials/H0grsrvgsBo.jpg

但是django的代码

response = HttpResponse()
del response['Content-Type']
response['X-Accel-Redirect'] = 'http://nginx/protected/media/' + path # I'm sure that this url matches to url I've used succesfully with wget
return response 

返回404 这是django的网址:

path('media/<path:path>', media_access, name='media')

我错了吗?

1 个答案:

答案 0 :(得分:1)

这听起来像是您要尝试为X-Accel-Redirect加上外部域/主机的绝对URL,因此需要按照http://nginx.org/r/internal删除internal无需身份验证即可访问的文件。它不是那样的。

看看http://nginx.org/r/proxy_pass_request_headers提供的示例,例如:

location /x-accel-redirect-here/ {
    proxy_method GET;
    proxy_pass_request_headers off;
    proxy_pass_request_body off;

    proxy_pass ...
}

nginx要求必须在X-Accel-Redirect中使用相对URL是完全合理的;否则,nginx将如何知道如何准确地处理请求?


换句话说,您可能必须在X-Accel-Redirect中使用相对URL,并且,如果需要转义到另一个容器中,则需要额外的internal location指令来进行显式proxy_pass,视情况而定。

请注意,这样做可能首先使使用X-Accel-Redirect的全部好处无效,尤其是由于http://nginx.org/r/proxy_buffering默认为on,这会导致nginx将每个代理文件保存到光盘,因此光盘吞吐量可能很快成为您设置中的限制因素。