gpt4 book ai didi

varnish - 用于更改 request.url 的 VCL 片段

转载 作者:行者123 更新时间:2023-12-03 17:47:06 27 4
gpt4 key购买 nike

我正在尝试实现VCL代码段(用于FaSTLy Varnish实现),该代码段会在将请求代理到服务之前替换URL。
例如。://domain.com/services/user/hello-world-> //userservice/hello-world为此,我编写了以下代码:

      if (req.url.path ~ "^/services/") {
set req.url = regsub(req.url, "/services/(.*?)/", "/");
}
应该在后端提取之前应用此方法,以免对缓存或其他条件造成任何影响。在文档中,应将其放在 vcl_pass中。那是对的吗? vcl_fetch似乎为时已晚。
在“快速设置”中将其编辑为:
enter image description here
这将生成以下 vcl_pass代码: https://gist.github.com/knyttl/ae1a3afbc219e311ace3d7d305f9142d
但是,由于目标后端接收未修改的完整URL,因此它不起作用。我究竟做错了什么? vcl_pass是执行此操作的正确阶段吗?

最佳答案

更新
好的,所以重新阅读原始海报的问题,我意识到首先我误解了他们的要求,但后来我也注意到他们对 Kailan 的回答的评论,这也略微调整了要求。
所以我的理解是现在的要求是......

  • 根据传入的请求路径修改后端。
  • 在不影响缓存的情况下修改传入的请求路径(例如,原始请求路径将是缓存查找中使用的路径)。

  • 例如,如果我们的默认后端是 httpbin.org 并且传入请求是 /services/users ,那么我们希望后端更改为另一个后端(我们会说 bbc.co.uk )。
    但我们也希望路径从 /services/user/ 变为 / ,而来自 bbc.co.uk 后端的响应缓存在 /services/users/的原始请求路径下。
    这是一个证明这一点的 fiddle :
    https://fiddle.fastlydemo.net/fiddle/e337b8f5

    Note: the reason you can't set a string to req.backend is because it needs to be assigned a specific BACKEND type.


    如果 fiddle 链接停止工作,代码如下......
    vcl_recv
    if (req.url.path ~ "^/services/user/" ) {
    // pretend www.bbc.co.uk is the correct backend for handling a 'user' request
    set req.backend = F_origin_1;
    }

    Note: backends are assigned to incrementing variables F_origin_0, F_origin_1 etc. So in my fiddle example F_origin_0 is httpbin.org while F_origin_1 is bbc.co.uk


    vcl_miss
    if (req.url.path ~ "^/services/.*") {
    set bereq.url = "/";
    }
    我的原始答案
    Kailan 的回答是正确的,应该这样标记,但为了完整起见,我将把它充实一点,以便原始海报对正在发生的事情有更清晰的概念性理解......
    对 Varnish 的传入请求被转换为 req 对象,该对象通过各种状态/子例程传递(例如 vcl_recv == 请求已接收, vcl_deliver == 请求已被处理并且响应准备好发送回客户端等)。
    您的条件逻辑应该添加到 vcl_recv 子例程中,因为这是传入请求的第一个“状态”,也是您可以修改请求的最早点。
    可以使用 return(<state>) 指令来控制通过 Varnish 的请求对象流,该指令指示要移动到下一个状态。 Varnish 具有默认行为,这意味着您无需在每个可用子例程的末尾显式调用 return(将为您调用一个将您的请求移至下一个逻辑状态/子例程),因此您决定明确更改使用 return 的默认请求流将取决于您尝试执行的操作(在您的情况下,您无需担心这一点)。
    典型/默认请求流会将请求对象从 vcl_recv 移动到 vcl_hash,因此 Varnish 可以生成“查找”键(用于查找先前缓存的请求版本),然后取决于请求的缓存版本发现请求将移动到 vcl_miss(未找到缓存版本)或 vcl_hit(找到缓存版本)。
    如果没有缓存内容,那么在 vcl_miss 之后,将向您的后端/源服务器发出请求,并且来自后端的响应将作为 vcl_fetch 对象提供给 beresp。最后,响应传递到 vcl_deliver 上,您可以在其中修改响应,然后再将其发送回客户端。
    请求 ( req ) 对象通过所有这些状态/子例程传递,这意味着您可以在整个请求流程中的任何时候访问它。
    如果您需要有关各种 VCL 子例程的更多指导(它们为什么存在,以及您可以在每个子例程中修改什么),那么快速将它们全部记录在此处(以及一个漂亮的“请求流”图): https://developer.fastly.com/learning/vcl/using/

    关于varnish - 用于更改 request.url 的 VCL 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65280866/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com