我遇到了类似的问题(所有 3 个场景),并且成功地使用了 Symfony 内置的反向代理缓存的以下策略:
如果使用 Apache,请更新.htaccess
以将应用程序的环境变量添加到 http 缓存关闭(注意:环境自动添加REDIRECT_
到环境变量):
# Add `REDIRECT_CACHE` if API subdomain
RewriteCond %{HTTP_HOST} ^api\.
RewriteRule .* - [E=CACHE:1]
# Add `REDIRECT_CACHE` if API subfolder
RewriteRule ^api(.*)$ - [E=CACHE:1]
app.php
实例化后添加AppKernel
:
// If environment instructs us to use cache, enable it
if (getenv('CACHE') || getenv('REDIRECT_CACHE')) {
require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppCache($kernel);
}
对于您的“静态”API,您所要做的就是获取您的响应对象并对其进行修改:
$response->setPublic();
$response->setSharedMaxAge(6 * 60 * 60);
因为你有一个会话、用户或安全令牌,Symfony 实际上默认为$response->setPrivate()
.
关于您的第二点,REST 约定(以及反向代理建议)、GET 和 HEAD 请求并不意味着在请求之间进行更改。因此,如果基于登录用户的内容发生更改,您应该将响应设置为私有并完全阻止反向代理缓存的缓存。
如果需要缓存以提高速度,则应在内部处理而不是由 reverse-proxy 处理。
因为我们不想基于每个用户角色引入 URL,所以我们只是在内部(使用 Redis)按角色缓存响应并直接返回它,而不是让缓存(错误)处理它。
至于您的第三点,由于 HTTP 和 HTTPS 流量正在访问相同的缓存,并且响应明确设置了公共/私有和缓存控制设置,因此AppCache
在安全和不安全流量中提供相同的响应。
我希望这对我有帮助!