gui*_*ier 6 api rest caching symfony
我在Symfony2上制作经典的无状态RESTfull API:用户/应用程序在身份验证API上获取身份验证令牌,并将其提供给所有其他要记录的API,并在其他API上发布数据/访问受保护/私有/个人数据.
我现在有三个关于此工作流程和缓存的问题:
如何为我的'静态'API(始终提供相同的内容,无论记录的用户及其令牌)使用HTTP缓存,假设不同的用户为同一个API在url中传递不同的令牌,以便url会永远不一样?那么如何使用HTTP共享缓存呢?
对于记录的用户权限(我基本上有4种不同的权限级别),我有相同URL的API生成不同的输出.问题是:这是一个好模式吗?拥有4个不同的网址,每个网址对应一个,我可以缓存,这不是更好吗?如果没有,如何实现适当的缓存?
共享HTTP缓存是否可以在HTTPS上运行?如果没有,我应该实现哪种类型的缓存,以及如何实现?
感谢您的回答和指示.
我遇到了类似的问题(包括所有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]
Run Code Online (Sandbox Code Playgroud)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);
}
Run Code Online (Sandbox Code Playgroud)对于"静态"API,您所要做的就是获取响应对象并对其进行修改:
$response->setPublic();
$response->setSharedMaxAge(6 * 60 * 60);
Run Code Online (Sandbox Code Playgroud)
因为您有会话,用户或安全令牌,所以Symfony有效默认为$response->setPrivate().
关于第二点,REST约定(以及反向代理建议),GET和HEAD请求并不意味着在请求之间进行更改.因此,如果内容根据登录用户而更改,则应将响应设置为private并完全阻止反向代理缓存的缓存.
如果速度需要缓存,则应在内部处理,而不是由反向代理处理.
因为我们不想基于每个用户角色引入URL,所以我们只是在内部缓存响应(使用Redis)并直接返回它而不是让缓存(mis)处理它.
至于你的第三点,因为HTTP和HTTPS流量正在达到相同的缓存,并且响应具有明确设置的公共/私有和缓存控制设置,所以AppCache提供安全和不安全流量的相同响应.
我希望这对我有所帮助!