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.