我使用RESTful、FosRestBundle和FosUserBundle用Symfony2编写了一个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当前用户在security.yml中传递安全性:
access_control:
- { path: ^/2013-08-30/foo$, role: ROLE_USER, requires_channel: https, methods: [GET] }简而言之,我如何告诉FosUserBundle当前用户的请求(从清漆发送)头?
发布于 2014-06-27 20:30:20
有几种方法可以解决这样的问题,如果您希望两个稍微不同的请求返回相同的响应(即请求仅通过API键get param不同),那么最快和最简单的解决方案就是使用hash_data函数在vcl_hash中自定义清漆的唯一性定义。您只需去掉所有不有助于使响应变得清晰的url元素,并对其进行散列。例如,如果url包含"access_token",则从散列键中删除所有GET params:
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 )相同,则可以使用边边包括。当然,这需要定制后端返回的内容。
https://stackoverflow.com/questions/20842104
复制相似问题