Django $sent_http_content_语言不';行不通

Django $sent_http_content_语言不';行不通,django,nginx,Django,Nginx,我的django站点有两种语言,当语言更改时,nginx使用旧语言命中缓存,而语言不会更改(当然,缓存页面不会更改)。为了防止出现这种情况,我需要将“$sent\u http\u content\u language”变量添加到我的“proxy\u cache\u key”中,但不起作用,即使我尝试使用: add_header Test $sent_http_content_language; 我要试试$sent\u http\u HEADER对于缓存键没有太大意义,因为这是响应的一

我的django站点有两种语言,当语言更改时,nginx使用旧语言命中缓存,而语言不会更改(当然,缓存页面不会更改)。为了防止出现这种情况,我需要将“$sent\u http\u content\u language”变量添加到我的“proxy\u cache\u key”中,但不起作用,即使我尝试使用:

    add_header Test $sent_http_content_language;


我要试试
$sent\u http\u HEADER
对于缓存键没有太大意义,因为这是响应的一部分。nginx在实际联系上游服务器并执行请求之前,无法访问响应

请注意,nginx无法告诉上游服务器“嘿……根据您刚才发送的响应头,我将从缓存中处理其余的请求”

所以。。。如果无法从请求中判断响应已在缓存中,则根本无法使用缓存

解决这个问题的一种方法是使用cookie;您可以将用户的语言首选项添加到cookie中,客户端将在后续请求时返回cookie。由于该值存在于请求中,因此可以在缓存键中使用它(如
$cookie\u lang
,如果响应具有
设置cookie:lang=tr


这有一个相关的问题;即使您在服务器上有这种缓存,使用响应的语言头,也可以工作;您仍然无法在客户端中看到更新;因为它会在浏览器缓存中。您无法关闭该缓存,也无法控制它,除非使用少数缓存控制头。从您发布的内容来看,它们似乎已经以合理的方式进行了设置(过期5分钟,更改标题列表
cookie
)。这意味着您需要履行这个承诺,并且只在符合这些请求头的情况下更改响应内容


幸运的是,添加一个cookie来表示语言确实尊重您正在使用的缓存控制头。

这非常有帮助。。。谢谢