Edge Functions declarations
Unlike regular functions, edge functions aren’t automatically assigned a URL route for you to use as a function endpoint. Instead, you configure your edge functions to run on specific URL patterns.
You can configure the edge function path inline in the function code or in netlify.toml
.
# Declare edge functions inline
To configure the edge function path in the same file as the function code, export a config
object with the following properties:
path
:URLPattern
expression on which paths to run the edge function. Must start with/
, for examplepath = "/*"
.excludedPath
: optionalURLPattern
exclusion to limit the routes matched bypath
. Must also start with/
, for exampleexcludedPath = "/*.css"
. Accepts a single string or an array of strings.pattern
: alternative to thepath
property that allows for regex path matching.excludedPattern
: optional regex exclusion to limit the routes matched bypattern
. Accepts a single regex or an array of regex.method
: optional HTTP methods that should run the edge function. Accepts a string or an array of strings.onError
: optional setting to control how this function handles errors.cache
: optional setting to opt in to response caching.
import type { Config } from "@netlify/edge-functions";
export default async () => new Response("Hello, world!");
export const config: Config = {
path: "/test",
};
This property can be a string if you want the edge function to run on a single path or an array of strings if you want to configure multiple paths.
In both cases, you can use URLPattern
expressions to match multiple paths.
import type { Config } from "@netlify/edge-functions";
export default async () => new Response("Hello, world!");
export const config: Config = {
path: ["/", "/products/*"],
};
To limit the paths matched, use excludedPath
.
import type { Config } from "@netlify/edge-functions"
export default async () => new Response("Hello, world!")
export const config: Config = {
path: "/*",
excludedPath: ["/*.css", "/*.js"]
}
This example shows an edge function that runs on all requests except for requests to CSS or JS files.
Values for path
and excludedPath
must start with /
, for example path: "/*"
.
# Declare edge functions in netlify.toml
If you would like to declare multiple edge functions to run on the same path and customize the order they run in, configure edge function paths in netlify.toml
instead of inline in the function file. You can use the following properties to configure edge_functions
in netlify.toml
:
function
: name of the edge function you’re configuring.path
:URLPattern
expression on which paths to run the edge function. Must start with/
, for examplepath = "/*"
.excludedPath
: optionalURLPattern
exclusion to limit the routes matched bypath
. Must also start with/
, for exampleexcludedPath = "/*.css"
. Accepts a single string or an array of strings.pattern
: alternative to thepath
property that allows for regex path matching.excludedPattern
: optional regex exclusion to limit the routes matched bypattern
. Accepts a single regex or an array of regex.cache
: optional setting to opt in to response caching.
Each edge function declaration associates one or more site paths or patterns with one function to execute on requests that match the paths or patterns. A single request can execute a chain of edge functions from a series of declarations. A single edge function can be associated with multiple paths across various declarations. Edge functions run in order of declaration in the file, from top to bottom, with the exception that edge functions configured for caching always run after those that are not.
[[edge_functions]]
path = "/admin"
function = "auth"
[[edge_functions]]
path = "/admin"
function = "injector"
cache = "manual"
[[edge_functions]]
path = "/blog/*"
function = "auth"
[[edge_functions]]
path = "/blog/*"
function = "rewriter"
[[edge_functions]]
pattern = "/products/(.*)"
excludedPattern = "/products/things/(.*)"
function = "highlight"
[[edge_functions]]
path = "/*"
excludedPath = "/img/*"
function = "common"
This example shows how both paths and functions can be configured across multiple declarations.
- A request for
/admin
would invoke theauth
function first, thencommon
, and finallyinjector
. Because it is configured for caching, theinjector
function runs after the other functions even though it is declared between them. - The
auth
function runs for the/admin
path and any child paths of/blog
.
# Declaration processing order
In general, edge functions are processed in the following order:
- edge functions declared in a configuration file run before those declared inline
- framework-generated edge functions run before user-created edge functions
- edge functions that are not configured for caching run before edge functions that are configured for caching
This section outlines the processing order, and any exceptions, in more detail.
When a request is made for a path, such as /admin
, edge functions run in the following order. Netlify loops through this order twice — the first time running edge functions that are not configured for caching and the second time running edge functions that are configured for caching.
Edge functions your framework generates and declares for the path in a configuration file.
Edge functions you declare for the path in
netlify.toml
. If you declare multiple edge functions for the same path, they run in order of declaration in the file, from top to bottom.Note that if you declare the same edge function both in
netlify.toml
and inline, Netlify merges the configurations and treats them as inline declarations (refer to step 4). The inline configuration takes precedence for any duplicate fields.Edge functions your framework and enabled integrations generate and declare for the path with inline configuration.
Edge functions you declare for the path with inline configuration. If you use inline configuration to declare multiple edge functions for the same path, they run in alphabetical order by function file name.
Once all edge functions for the path run, Netlify moves on to evaluate any redirect rules — unless the last edge function returns a response and ends the request chain. A redirect might request a new path that also requires edge functions and the above steps will repeat for that new path.
The request chain continues until it eventually serves static content or returns a request from a serverless function. Learn more about request handling with edge functions.
Use netlify.toml
to be explicit about edge function order
If you want to customize the order in which multiple edge functions run on a given path, we recommend that you add the declarations to netlify.toml
instead of using inline declarations.
# Processing order caveats
Keep the following caveats in mind as you write and configure your edge functions as these items can interrupt or change the expected order of events:
- If the edge function for a path returns a response and terminates the request, redirects for that path do not occur.
- If you declare an edge function for the target path of a static routing rewrite, the page at the target path will be served but the edge function will not execute for rewritten requests.
- If the edge function uses
fetch()
for internal requests orURL()
for internal rewrites, the command will start a new request chain and Netlify will run any edge functions that match that path first. If you want to request a specific static asset or serverless function with the same internal path, and not re-run the same edge functions, usecontext.next()
instead. - If an edge function fails, what happens next depends on its error handling configuration.
Along with considering these caveats, we recommend you also review the edge functions feature limitations.
Did you find this doc useful?
Your feedback helps us improve our docs.