恐怕我对varnish还是个新手,但是我有一个问题,我在任何地方都找不到解决方案: Varnish被设置为缓存GET请求。我们有一些请求,它们有太多的参数,所以我们决定在请求的主体中传递它们。当我们绕过Varnish时,这可以很好地工作,但是当我们使用Varnish (用于缓存)时,请求在没有正文的情况下被传递,因此Varnish背后的服务失败。
我知道我们可以使用POST,但我们想要获取数据。我还知道,如果我们使用pass模式,Varnish可以传递请求体,但据我所知,在pass模式下发出的请求不会被缓存。我已经在url中加入了一个哈希值,这样当一切正常时,我们实际上会从缓存中获得正确的数据(就url而言,否则调用看起来都是一样的)。
现在的问题是,“仅仅”如何重写vcl_fetch来将请求正文传递给now服务器?欢迎任何提示和技巧!
提前感谢
琼恩
发布于 2011-12-02 02:15:04
我不认为你可以,但是,即使你可以,这也是非常危险的: Varnish不会将请求主体存储到缓存或哈希表中,因此它无法看到具有相同URI和不同主体的两个请求之间的任何差异。
我还没有听说过用于读取请求体的VCL键,但是,如果它存在,你可以将它传递给req.hash来区分请求。
无论如何,请求正文应该只与POST或PUT...and POST/PUT请求一起使用,而不应该缓存。
请求body应该将数据发送到服务器。缓存用于获取数据...
我不知道细节,但我认为在你的过程中有一个设计问题...
发布于 2011-12-29 21:12:54
我不确定我是否正确地回答了您的问题,但是如果您尝试以某种方式与请求主体交互,这在VCL中是不可能的。您没有任何VCL变量/子例程来执行此操作。
您可以在VCL中找到可用的变量列表(或在man vcl中):
我同意Gauthier的观点,您的系统似乎存在设计问题。
“希望这能有所帮助。”
https://stackoverflow.com/questions/7381220
复制相似问题