作为网络服务器的清漆

qui*_*ver 1 varnish

我正在寻找一种方法来配置 Varnish 以处理 Varnish 中的 HTTP 请求。

更具体地说,对于特定路径(例如在 */foo/** 下),我希望 Varnish 以 200 HTTP 状态代码和空(或固定消息)正文进行响应,而不是将请求转发到后端服务器。

Jen*_*ler 5

我同意迈克尔为此目的对滥用/使用 vcl_error 的简短回应,并希望向您展示我们在下面的示例代码中的含义。

为了滥用 vcl_error,我在这里使用了 HTTP 标准之外的错误代码,并对此类错误实施了特殊处理。

VCL_RECV 中的示例:

sub vcl_recv {
  ...
  # respond HTTP 200 to /ping requests
  if (req.url ~ "^/ping") {
    error 700;
  }
  # return a 301 redirect
  if (req.url ~ "^/wrong-target") {
    error 751 "http://www.example.com/correct-target";
  }
}
Run Code Online (Sandbox Code Playgroud)

VCL_ERROR 中的示例:

sub vcl_error {
  # send response "Pong" (HTTP 200)
  if (obj.status == 700) {
    set obj.status = 200;
    set obj.response = "OK";
    set obj.http.Content-Type = "text/plain";
    synthetic {"Pong"};
    return (deliver);
  }
  # send empty response (HTTP 204)
  if (obj.status == 701) {
    set obj.status = 204;
    set obj.response = "No Content";
    synthetic {""};
    return (deliver);
  }
  # redirect 301
  if (obj.status == 751) {
    set obj.http.Location = obj.response;
    set obj.status = 301;
    set obj.response = "Moved Permanently";
    return (deliver);
  }
  # redirect 302
  if (obj.status == 752) {
    set obj.http.Location = obj.response;
    set obj.status = 302;
    set obj.response = "Found";
    return (deliver);
  }
  # Fall through to default behavior for all other exceptions
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,也是处理此问题的官方方法(根据 Varnish 文档)。然而,你的答案和 Varnish 文档都有一个遗漏:如果你没有将 `obj.response` 设置为正常的东西,那么你会得到 `HTTP/1.1 200 Unknown Error` 甚至`HTTP/1.1 200 http: //www.example.com/correct-target` 在您的回复中!简单的修复:`obj.response = "OK"` 用于`200`,或其他适当的代码。 (2认同)