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.