Configuration: placeholders
This page describes placeholder variables that can be used in KDL directives. There are two kinds: environment variable placeholders (resolved when the configuration file is loaded) and request/logging placeholders (resolved per request).
Environment variable placeholders
Environment variable placeholders let you reference environment variables directly in your KDL configuration. They are resolved when the server starts, so the values are baked into the parsed configuration.
Syntax
{env:VARIABLE_NAME}Behavior
- If the environment variable exists, its value is substituted in place of the placeholder.
- If the environment variable is missing or unset, the placeholder text is kept as-is (for example,
{env:MY_VAR}). - Unknown placeholder kinds (anything other than
env) are also kept as-is.
Examples
Given these environment variables:
export APP_ROOT="/var/www/app"
export DB_HOST="db.example.com"You can use them in a KDL configuration like this:
site {
root "{env:APP_ROOT}/public"
reverseProxy {
to "http://{env:DB_HOST}:5432"
}
}At load time, these resolve to:
site {
root "/var/www/app/public"
reverseProxy {
to "http://db.example.com:5432"
}
}Notes
- Environment variable placeholders work in any string value throughout the KDL configuration file.
- They are resolved early, before the configuration is parsed, so they behave like compile-time constants.
- If you need a variable that changes at runtime (per request), use one of the request placeholders instead.
Placeholders
Ferron supports the following placeholders for header values, subconditions, reverse proxying, and redirect destinations:
{path}- the request URI with path (for example,/index.html){path_and_query}- the request URI with path and query string (for example,/index.html?param=value){method}- the request method{version}- the HTTP version of the request{header:<header_name>}- the value of a header with the specified name (<header_name>is replaced with the name of the header, for example,Content-Type){scheme}- the scheme of the request URI (httporhttps), applicable only for subconditions, reverse proxying and redirect destinations.{client_ip}- the client IP address, applicable only for subconditions, reverse proxying and redirect destinations.{client_port}- the client port number, applicable only for subconditions, reverse proxying and redirect destinations.{client_ip_canonical}(Ferron 2.3.0 or newer) - the client IP address in canonical form (IPv4-mapped IPv6 addresses, like::ffff:127.0.0.1, are converted to IPv4, like127.0.0.1), applicable only for subconditions, reverse proxying and redirect destinations.{server_ip}- the server IP address, applicable only for subconditions, reverse proxying and redirect destinations.{server_port}- the server port number, applicable only for subconditions, reverse proxying and redirect destinations.{server_ip_canonical}(Ferron 2.3.0 or newer) - the server IP address in canonical form (IPv4-mapped IPv6 addresses, like::ffff:127.0.0.1, are converted to IPv4, like127.0.0.1), applicable only for subconditions, reverse proxying and redirect destinations.
Log placeholders
Ferron 2.0.0 and newer supports the following placeholders for access logs:
{path}- the request URI with path (for example,/index.html){path_and_query}- the request URI with path and query string (for example,/index.html?param=value){method}- the request method{version}- the HTTP version of the request{header:<header_name>}- the value of a header with the specified name (<header_name>is replaced with the name of the header, for example,Content-Type;-, if header is missing){scheme}- the scheme of the request URI (httporhttps).{client_ip}- the client IP address.{client_port}- the client port number.{client_ip_canonical}(Ferron 2.3.0 or newer) - the client IP address in canonical form (IPv4-mapped IPv6 addresses, like::ffff:127.0.0.1, are converted to IPv4, like127.0.0.1).{server_ip}- the server IP address.{server_port}- the server port number.{server_ip_canonical}(Ferron 2.3.0 or newer) - the server IP address in canonical form (IPv4-mapped IPv6 addresses, like::ffff:127.0.0.1, are converted to IPv4, like127.0.0.1).{auth_user}- the username of the authenticated user (-, if not authenticated){timestamp}- the formatted timestamp of the entry{status_code}- the HTTP status code of the response{content_length}- the content length of the response (-, if not available)
These placeholders can be used both in log_format and in log_json additional property templates.