Concordo com a resposta curta de Michael ao abuso / uso de vcl_error para esse propósito e gostaria de mostrar a você o que entendemos no código de exemplo abaixo.
Para abusar de vcl_error, usei aqui códigos de erro fora do padrão HTTP e implementei um tratamento especial para esse tipo de erro.
Exemplo em 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";
}
}
Exemplo em 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
}