Django X-Accel-Redirect功能不适用于外部连接(docker网络内部)
我正在尝试允许带有django的容器管理对另一个带有nginx的容器提供的媒体文件的访问。因此,尽管有nginx文档,我还是从位置配置中删除了Django X-Accel-Redirect功能不适用于外部连接(docker网络内部),django,nginx,x-accel-redirect,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;
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,因此我成功地完成了wgethttp://nginx/protected/media/images/bank_credentials/H0grsrvgsBo.jpg
来自装有django的容器外壳
但是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的url:
path('media/<path:path>', media_access, name='media')
path('media/',media\u access,name='media')
我错在哪里?听起来你想做的是让
X-Accel-Redirect
具有外部域/主机的绝对URL,因此需要根据删除内部
,以便无需身份验证即可访问文件。它不是那样工作的
请看下面提供的示例,例如:
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,如果您需要转义到另一个容器中,则需要使用额外的内部位置
指令来执行显式的代理传递
请注意,这样做可能会使首先使用X-Accel-Redirect
的全部好处失效,特别是由于默认情况下处于打开状态,这会导致nginx将每个代理文件保存到光盘上,因此,光盘吞吐量可能很快成为您设置中的限制因素。您是否直接使用Django检查URL,而不使用中间的Nginx?您这里的真正意思是逗号alias/data/djan,go/media/代码>?