6

我正在 Symfony2 上制作经典的无状态 RESTfull API:用户/应用程序在身份验证 API 上获取身份验证令牌,并将其提供给所有其他 API 以记录并在其他 API 上发布数据/访问受保护/私人/个人数据。

我现在对这个工作流程和缓存有三个担忧:

  • 如何为我的“静态”API 使用 HTTP 缓存(始终提供相同的内容,无论登录的用户及其令牌)假设不同的用户将在 url 中为同一 API 传递不同的令牌,以便 url 将永远不一样?那么如何使用 HTTP 共享缓存呢?

  • 关于记录的用户权限(我基本上有 4 个不同的权限级别),我有相同 url 的 API 产生不同的输出。问题是:这是一个好的模式吗?拥有 4 个不同的 url,每个权利一个,我可以缓存不是更好吗?如果没有,如何实现适当的缓存?

  • 共享 HTTP 缓存是否适用于 HTTPS?如果没有,我应该实现哪种类型的缓存,以及如何实现?

感谢您的回答和说明。

4

1 回答 1

8

我遇到了类似的问题(所有 3 个场景),并且成功地使用了 Symfony 内置的反向代理缓存的以下策略:

  1. 如果使用 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]
    
  2. 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);
    }
    
  3. 对于您的“静态”API,您所要做的就是获取您的响应对象并对其进行修改:

    $response->setPublic();
    $response->setSharedMaxAge(6 * 60 * 60);
    

    因为你有一个会话、用户或安全令牌,Symfony 实际上默认为$response->setPrivate().

关于您的第二点,REST 约定(以及反向代理建议)、GET 和 HEAD 请求并不意味着在请求之间进行更改。因此,如果基于登录用户的内容发生更改,您应该将响应设置为私有并完全阻止反向代理缓存的缓存。

如果需要缓存以提高速度,则应在内部处理而不是由 reverse-proxy 处理

因为我们不想基于每个用户角色引入 URL,所以我们只是在内部(使用 Redis)按角色缓存响应并直接返回它,而不是让缓存(错误)处理它。

至于您的第三点,由于 HTTP 和 HTTPS 流量正在访问相同的缓存,并且响应明确设置了公共/私有和缓存控制设置,因此AppCache在安全和不安全流量中提供相同的响应。

我希望这对我有帮助!

于 2012-08-23T04:05:08.213 回答