148 words, 1 min read

If you're using Caddy and wondering why a specific route like /hello isn't returning your expected response and instead always redirects, you're not alone. Consider this Caddyfile:

www.mysite.com {
respond /hello 200
respond "hello world"
redir https://anothersite.be
}

You might expect /hello to return a 200 OK or "hello world", but instead, every route redirects to https://anothersite.be. Why?

Caddy doesn't process directives in the order they appear in your Caddyfile. Instead, it follows a fixed internal order, and redir is executed before respond. That means your respond directives are never reached—they’re skipped after the redirect.

To explicitly control routing behavior, use handle or handle_path blocks. Here's the correct way to return "hello world" only at /hello, and redirect everything else:

www.mysite.com {
handle_path /hello {
respond "hello world"
}
handle {
redir https://anothersite.be
}
}

This ensures Caddy responds to /hello as expected and redirects all other paths.