Available inall subroutines.

Looks up the key key in the table ID. When the key is present, its associated value will be returned. When the key is absent, a not set string value is returned.

You can use table.contains to check for the presence of a key. If you plan to do a lookup of that key's value, consider combining the calls into a single lookup to find the key's presence and the stored value at the same time. For example:

# note this depends on using a header, not a STRING variable
set req.http.x = table.lookup(t, "key");
if (!req.http.x) { # equivalent to if (!table.contains(t, "key"))
# no such key
} else {
# use the value of req.http.x

This works because a not set header compares false in conditions. The condition above depends on using a header for the returned value and not a local STRING variable. This is because a not set value is converted to an empty string when assigned to a STRING variable and the empty string always compares true in conditions. See VCL Types for details of the type conversion.

When a third STRING argument is provided, the lookup function behaves as it would normally, except when a key is absent, the default value is returned instead.


table geoip_lang {
"US": "en-US",
"FR": "fr-FR",
"NL": "nl-NL",
if (!req.http.Accept-Language) {
set req.http.Accept-Language = table.lookup(geoip_lang, client.geo.country_code, "en-US");
table extension {
"xhtml5": "xhtml",
"html5": "html",
"htm": "html",
"aif": "aiff",
"tif": "tiff",
"jpg": "jpeg",
"mpg": "mpeg",
sub vcl_recv {
# normalizing URL file extensions
declare local var.ext STRING;
# lowercase for both the table key and for the default value
set var.ext = std.tolower(req.url.ext);
set var.ext = table.lookup(extension, var.ext, var.ext);

Try it out

table.lookup is used in the following code examples. Examples apply VCL to real-world use cases and can be deployed as they are, or adapted for your own service. See the full list of code examples for more inspiration.

Click RUN on a sample below to provision a Fastly service, execute the code on Fastly, and see how the function behaves.

Apply HTTP basic auth to private endpoints

Store username/password list in an edge dictionary, authorize user at the edge, reject requests that don't have correct credentials.

Ban bad IPs for a fixed period

Block a list of IP addresses from accessing your service and include an expiry time.

Redirect old URLs at the edge

Use a dictionary of URL mappings to serve your redirects at lightning speed.

User contributed notes


Do you see an error in this page? Do you have an interesting use case, example or edge case people should know about? Share your knowledge and help people who are reading this page! (Comments are moderated; for support, please contact Fastly support)