Can Caddy redirect an incoming request based on header values?

1. Caddy version (caddy version):

v2.2.1 h1:Q62GWHMtztnvyRU+KPOpw6fNfeCD3SkwH7SfT1Tgt2c=

2. How I run Caddy:

official systemd unit from the github repo, no alterations

a. System environment:

ubuntu 18.04 lts, systemd controlled start

b. Command:

systemctl start caddy

c. Service/unit/compose file:

official service unit from github

d. My complete Caddyfile or JSON config:

(gen) {
	encode gzip
	try_files {path} {path}.html
	php_fastcgi unix//var/run/php/php7.4-fpm.sock
	file_server
	handle_errors {
		rewrite * /{http.error.status_code}
		reverse_proxy https://http.cat {
			header_up Host http.cat
		}
	}
	log {
		format console
		output file /var/log/caddy.log {
			roll_size 25mb
			roll_keep 20
			roll_keep_for 720h
		}
	}
}

(dns) {
	tls {
		dns digitalocean redacted lol
	}
}

(header-gen) {
	header {
		Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"
		X-XSS-Protection "1; mode=block"
		X-Content-Type-Options "nosniff"
		X-Frame-Options "DENY"
	}
}

eiphax.tech {
	header {
		Strict-Transport-Security "max-age=31536000; preload"
		X-XSS-Protection "1; mode=block"
		X-Content-Type-Options "nosniff"
		X-Frame-Options "DENY"
	}
	root * /var/www/eipdox
	import gen
}

facts.eiphax.tech {
	import header-gen
	root * /var/www/eipdox/facts
	import gen
}

soultrader.net.au {
	import header-gen
	root * /var/www/st
	import gen
}

blog.eiphax.tech {
	import header-gen
	root * /var/www/blog
	import gen
}

album.eiphax.tech {
	import header-gen
	root * /var/www/lychee/public
	import gen
}

bin.eiphax.tech {
	import header-gen
	root * /var/www/eipbin
	import gen
}

3ds.eiphax.tech {
	import header-gen
	root * /var/www/eipdox/3ds
	import gen
}

http://wiiu.eiphax.tech {
	root * /var/www/eipdox/wiiu
	import gen
}

https://wiiu.eiphax.tech {
	root * /var/www/eipdox/wiiu
	import gen
}

nx.eiphax.tech {
	import header-gen
	root * /var/www/eipdox/nx
	import gen
}

nintendohomebrew.com {
	header {
		Strict-Transport-Security "max-age=31536000; preload"
		X-XSS-Protection "1; mode=block"
		X-Content-Type-Options "nosniff"
		X-Frame-Options "DENY"
	}
	root * /var/www/eipdox/nh
	import gen
}

http://bhax.nintendohomebrew.com {
	root * /var/www/bhax/web/nbhax
	try_files {path} {path}.html
	encode gzip
}

bfm.nintendohomebrew.com {
	import header-gen
	root * /var/www/eipdox/nh/seed
	reverse_proxy localhost:8082
	encode gzip
	file_server
	handle_errors {
		rewrite * /{http.error.status_code}
		reverse_proxy https://http.cat {
			header_up Host http.cat
		}
	}
	log {
		level error
		format console
		output file /var/log/bfm_error.log {
			roll_size 25mb
			roll_keep 20
			roll_keep_for 720h
		}
	}
}

http://part1dumper.nintendohomebrew.com https://part1dumper.nintendohomebrew.com {
	reverse_proxy localhost:8081
}

shitpost.lol {
	import header-gen
	root * /var/www/sp
	import gen
}

hacc.me please.hacc.me {
	import header-gen
	root * /var/www/hacc
	import gen
}

friigaemsworld.com {
	import header-gen
	root * /var/www/frigam
	import gen
}

uwu.tax {
	import header-gen
	root * /var/www/uwu
	import gen
}

conversation.id {
	import header-gen
	root * /var/www/conv
	import gen
}

puebes.com {
	import header-gen
	root * /var/www/puebes
	import gen
}

3. The problem I’m having:

not a problem, per se, but i’m wanting to see if i can intercept an incoming request for example.com/foo/bar.png, check the referrer (which caddy already seems to capture based on logs), and if referrer = foo, serve foo.png from the same directory, if referrer = any other, serve bar.png as originally requested

5. What I already tried:

nothing, yet… i’ve had a look at rewrite and uri, but they don’t seem to have the “if > then” that i think i need. i’ve also looked at placeholders, and i guess i’d be using {header.Referer} but i don’t know how to actually implement what i’m thinking here.

6. Links to relevant resources:

Yeah, you want to use request matchers:

So something like this maybe:

@hasFoo header Referer *foo*
rewrite @hasFoo /foo/foo.png

But I’m not totally clear on your goal (the explanation isn’t generalized enough) so that’s the best assumption I can make.

You need to read about matchers: here. I linked the bit about header fields, but near the top you need to read about whether matches are ANDed or ORed.

Paul

This topic was automatically closed after 30 days. New replies are no longer allowed.