我使用FosOauth2Serverbundle,FosRestBundle和FosUserBundle在Symfony2中编写了RESTful Api。我计划在我的api前面涂清漆作为反向代理。由于我的应用程序使用我的api总是发送access_token作为参数或标头清漆缓存几乎每个请求作为不同的请求,它是无效的。因为我在我的控制器中使用access_token的用户来保证安全性,有时用于内容,所以我无法从vcl_recv中的请求中完全删除access_token请求。在互联网上进行了几次搜索之后,我遇到了一个身份验证解决方案http://www.adayinthelifeof.nl/2012/07/06/using-varnish-to-offload-and-cache-your-oauth-requests/。但是,我无法弄清楚如何告诉FosUserBundle当前用户在header中传递security.yml中的安全性:
access_control:
- { path: ^/2013-08-30/foo$, role: ROLE_USER, requires_channel: https, methods: [GET] }
简而言之,我如何告诉FosUserBundle当前用户请求(从清漆发送)标题?
答案 0 :(得分:1)
有两种方法可以解决这类问题,如果你想要两个略有不同的请求来返回相同的响应(即请求只有API密钥GET参数不同)最快最简单的解决方案是自定义清漆&# 39;使用vcl_hash中的hash_data函数定义唯一性。您只需删除所有不会对响应做出贡献的所有url元素并将其哈希。例如,如果网址包含" access_token",请从哈希键中删除所有GET参数:
sub vcl_hash {
if (req.url ~ "access_token"){
set req.url = regsub(req.url, "^https?://(.*)\?access_token=.*$","\1");
}
hash_data(req.url);
}
换句话说,这会将mydomain.com/some/restful/request?access_token=abc和mydomain.com/some/restful/request?access_token=def作为匹配缓存。
如果响应大致相同,应该是唯一的小区域(即大型JSON响应中的一个值,或标题中的div表示"欢迎用户名!"),您可以使用edge side includes。当然,问题在于这需要定制后端返回的内容。