Configuring Caddy for Pi-hole

This is an unsupported configuration created by the community

If you'd like to use Caddy as your main web server with Pi-hole, you'll need to make a few changes.

Modifying lighttpd configuration

First, change the listen port in this file: /etc/lighttpd/lighttpd.conf:

server.port = 1080

In this case, port 1080 was chosen at random. You can use a custom port.

Next, restart the lighttpd server with either of these commands:

sudo systemctl restart lighttpd


sudo service lighttpd restart

Setting up your Caddyfile

Now set up a "virtual host" in your Caddyfile (default /etc/caddy/Caddyfile). There are many options you can add, but at a minimum, you need to make a "default" host by binding This will accept requests for any interface.

blackhole:80, pi.hole:80, {
  root /var/www/html/pihole
  log /var/log/caddy/blackhole.log

  rewrite {
    ext js
    to index.js

  proxy / localhost:1080 {

In this case, I've chosen to also add blackhole and pi.hole as valid names to open the admin page with.

Finally, restart your Caddy server: sudo service caddy restart

Verifying your setup

First, make sure that any other sites you're serving from caddy are still functioning. For example, if you have a block for in your Caddyfile, open up a browser to and verify it still loads.

Next, verify you can load the admin page. Open up http://pi.hole/admin (or use the IP address of your server) and verify that you can access the admin page.

Finally, verify that requests for ads are being black holed:

$ curl -H "Host: badhost" pi.hole/

Replace the URL pi.hole with the IP address or alternate DNS name you're using if necessary.

Lastly, ensure that requests for JavaScript files from advertisement domains are being served properly:

curl -H "Host: badhost" pi.hole/malicious.js
var x = "Pi-hole: A black hole for Internet advertisements."

Last update: February 5, 2020