Variables in VCL

VCL provides a multitude of predefined variables describing the state and properties of a request, and also provides a mechanism for declaring custom local variables. Custom variables are always scoped to the subroutine in which they are defined, while predefined variables have a variety of different scopes depending on their purpose and content, and their availability is indicated on each variable's reference page.

Predefined variables

Explore all available variables here:

Several predefined variables relate to various views of the HTTP exchange: the client request (req), backend request (bereq), backend response (beresp), cached object (obj), and client response (resp). These are accessible in their respective parts of the VCL lifecycle (for [R]eading and [W]riting):

Variablerecvhashhitmisspassfetcherrordeliverlog
req.*R/WR/WR/WR/WR/WR/WR/WR/WR/W
bereq.*R/WR/WR/WR 1️⃣
obj.*RR/W
beresp.*R/W
resp.*R/WR/W

1️⃣ A small number of bereq. variables are available to read in the vcl_log subroutine.

User defined variables

Custom variables must be declared before they are used, usually at the beginning of a subroutine, before any statements. They can only be used in the same subroutine in which they are declared. Fastly VCL does not provide block scope: declarations apply to an entire subroutine's scope even if a variable is declared within a block.

Custom variables must start with var. and otherwise consist of characters in the set [A-Za-z0-9._-]. The declaration syntax is:

declare local var.{NAME} {TYPE};

For example:

declare local var.gcs_bucket_name STRING;

Variables can be any of the valid VCL types. Declared variables are initialized to the zero value of the type:

You can assign values to custom variables using set (custom variables cannot be unset):

set var.gcs_bucket_name = "production-site";