- If there is **only one site block**, its curly braces `{ }` are optional.
A Caddyfile consists of at least one or more site blocks, which always starts with one or more [addresses](#addresses) for the site. Any directives appearing before the address will be confusing to the parser.
### Blocks
Opening and closing a **block** is done with curly braces:
```
... {
...
}
```
- The open curly brace `{` must be at the end of its line.
- The close curly brace `}` must be on its own line.
When there is only one site block, the curly braces (and indentation) are optional. This is for convenience to quickly define a single site, for example, this:
```
localhost
reverse_proxy /api/* localhost:9001
file_server
```
is equivalent to:
```
localhost {
reverse_proxy /api/* localhost:9001
file_server
}
```
when you have only a single site block; it's a matter of preference.
To configure multiple sites with the same Caddyfile, you **must** use curly braces around each one to separate their configurations:
```
example1.com {
root * /www/example.com
file_server
}
example2.com {
reverse_proxy localhost:9000
}
```
### Directives
**Directives** are keywords which customize how the site is served. For example, a complete file server config might look like this:
```
localhost
file_server
```
Or a reverse proxy:
```
localhost
reverse_proxy localhost:9000
```
In these examples, `file_server` and `reverse_proxy` are directives. Directives are the first word on a line in a site block.
In the second example, `localhost:9000` is an **argument** because it appears on the same line after the directive.
**Subdirectives** can appear in directive blocks:
```
localhost
reverse_proxy localhost:9000 localhost:9001 {
lb_policy first
}
```
Here, `lb_policy` is a subdirective to `reverse_proxy` (it sets the load balancing policy to use between backends).
## Addresses
An address always appears at the top of the site block, and is usually the first thing in the Caddyfile.
<ahref="/docs/automatic-https">Automatic HTTPS</a> is enabled if your site's address contains a hostname or IP address. This behavior is purely implicit, however, so it never overrides any explicit configuration. For example, if the site's address is <code>http://example.com</code>, auto-HTTPS will not activate because the scheme is explicitly <code>http://</code>.
If you specify a hostname, only requests with a matching Host header will be honored. In other words, if the site address is `localhost`, then Caddy will not match requests to `127.0.0.1`.
Request matchers can be used to classify requests by a given criteria. This concept originates in the [underlying JSON](/docs/json/apps/http/servers/routes/match/) structure, and it's important to know how to use them in the Caddyfile. With matchers, you can specify exactly which requests a certain directive applies to.
You can use any [Caddy placeholders](/docs/conventions#placeholders) in the Caddyfile, but for convenience you can also use some equivalent shorthand ones:
You can define special blocks called snippets by giving them a name surrounded in parentheses:
```
(redirect) {
@http {
scheme http
}
redir @http https://{host}{uri}
}
```
And then you can reuse this anywhere you need:
```
import redirect
```
The `import` directive can also be used to include other files in its place. As a special case, it can appear almost anywhere within the Caddyfile.
## Comments
Comments start with `#` and proceed until the end of the line:
```
# Comments can start a line
directive # or go at the end
```
## Environment variables
If your configuration relies on environment variables, you can use them in the Caddyfile:
```
{$SITE_ADDRESS}
```
Environment variables in this form are substituted before parsing begins, so they can expand to empty values, partial tokens, complete tokens, or even multiple tokens and lines.
If you want to defer the substitution of an environment variable until runtime, you can use the [standard `{env.*}` placeholders](/docs/conventions#placeholders).
## Global options
A Caddyfile may optionally start with a special block that has no keys, called a [global options block](/docs/caddyfile/options):
```
{
...
}
```
If present, it must be the very first block in the config.
It is used to set options that apply globally, or not to any one site in particular. Inside, only global options can be set; you cannot use regular site directives in them.
[Learn more](/docs/caddyfile/options) about the global options block.