我正在尝试设置一个 NGINX 服务器,作为位于另一台服务器上的底层 PHP 应用程序的缓存服务器。原则上,一切运行良好,但由于 PHP 应用程序的一些“不良行为”,我需要对 NGINX 进行一些调整,但到目前为止我还没有成功。有解决这些问题的方法吗?
问题 1:PHP 应用程序发送“Vary: Accept-Encoding”作为可缓存内容的响应标头,导致 NGINX 为不同的 Accept-Encoding 请求标头保留不同的缓存副本,这是正确的,但不是我希望它表现的方式。我的需求要求 NGINX 在代理 PHP 应用程序时删除 Accept-Encoding 请求标头,并在缓存时忽略该标头。
我已经通过使用以下方式实现了第一部分:
proxy_set_header Accept-Encoding "";
此配置会从请求中删除标头,但不会从缓存的角度忽略它。我非常了解 proxy_ignore_headers,并且我可以在以下设置中使用它,但此类解决方案将忽略 Vary 标头中的任何标头名称,而不仅仅是 Accept-Encoding
proxy_ignore_headers Vary;
这个问题有解决办法吗?
问题2:
PHP 应用程序正在尝试为可缓存内容设置会话 cookie。我希望 NGINX 忽略用于缓存的 Set-Cookie 标头,但也删除任何可缓存内容的响应标头 Set-Cookie。
为了让 NGINX 在缓存方面忽略 Set-Cookie 响应标头,我使用了:
proxy_ignore_headers Set-Cookie;
NGINX 确实会忽略标头,但它会将 Set-Cookie 响应标头发送给任何访问缓存的用户。NGINX 上是否有解决方案,我可以根据页面是否正在缓存来删除标头。
我尝试使用 if 子句来检查 $sent_http_cache_control 变量,但似乎 if 语句在响应可用后不会重新运行,因此在评估 if 时不会设置此类变量。