我正在 Symfony2 上制作经典的无状态 RESTfull API:用户/应用程序在身份验证 API 上获取身份验证令牌,并将其提供给所有其他 API 进行记录并发布数据/访问其他 API 上的受保护/私有/个人数据。
我现在对这个工作流程和缓存有三个担忧:
如何为我的“静态”API 使用 HTTP 缓存(无论登录的用户及其令牌如何,始终提供相同的内容),假设不同的用户在同一 API 的 url 中传递不同的令牌,以便该 url永远不会一样?那么如何使用HTTP共享缓存呢?
我有相同 url 的 API,它们会产生不同的输出,涉及记录的用户权限(我基本上有 4 个不同的权限级别)。问题是:这是一个好的模式吗?有 4 个不同的 url,每个权利一个,我可以缓存不是更好吗?如果没有,如何实现适当的缓存?
共享 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]
-
将其添加到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 请求并不意味着在请求之间进行更改。因此,如果内容根据登录用户而更改,您应该将响应设置为私有并完全阻止反向代理缓存的缓存。
如果需要缓存以提高速度,则应在内部处理而不是由反向代理处理.
因为我们不想根据每个用户角色引入 URL,所以我们只是在内部按角色缓存响应(使用 Redis)并直接返回它,而不是让缓存(错误)处理它。
至于你的第三点,因为 HTTP 和 HTTPS 流量访问相同的缓存,并且响应具有显式设置的公共/私有和缓存控制设置,因此AppCache
为安全和不安全的流量提供相同的响应。
我希望这对我有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)