为什么nginx不转发Apache以代理方式发送的Vary header?

Why nginx does not forward Vary header sent by Apache in proxy mode?

我正在使用 Plesk(好像是 OVH 提供的 17.8.11)并且 nginx 配置为代理。当浏览器接受时,我的 PHP 将 returns 图像脚本转换为 WEBP 格式,否则它 returns 原始格式(JPG 或 PNG)。

In .htaccess I return header Vary: Accept 所以代理知道内容取决于 Accept header.

在 Plesk 的 nginx 设置中,我只勾选了 'Proxy mode' 选项,其他复选框都被清除了。 当我获取图像时 Vary: Accept 不存在,我无法想象 nginx 无法处理这个 header,请帮我解决这个问题。

要使 Vary: header 被 nginx 允许和理解,您需要在 /etc/nginx/nginx.conf 中设置 gzip ongzip_vary on

Plesk 实际上有关于它的文档,您查看 Plesk 支持网站了吗? https://support.plesk.com/hc/en-us/articles/213380049-How-to-enable-disable-gzip-compression-in-nginx-on-a-Plesk-server

对了,你的Plesk版本太旧了,建议你更新一下。

我终于找到了原因:我没有为“.webp”扩展名发送"Vary: Accept" header,只为“.jpg”和“.png”发送。我的 URL 以 .jpg 或 .png 结尾,从不以 .webp 结尾,这在 Apache 上运行良好。这是我的 htaccess 指令:

<IfModule mod_setenvif.c>
    SetEnvIf Request_URI "\.(jpe?g|png)$" REQUEST_image
</IfModule>
<IfModule mod_headers.c>
    Header append Vary Accept env=REQUEST_image
</IfModule>

为了修复它,我在 URL 过滤器中添加了 .webp:

<IfModule mod_setenvif.c>
    SetEnvIf Request_URI "\.(jpe?g|png|webp)$" REQUEST_image
</IfModule>
<IfModule mod_headers.c>
    Header append Vary Accept env=REQUEST_image
</IfModule>

现在一切都好了。