I’m trying to do a 301 permanent redirect for
assets.example.com/x/y/z?a=b
to
example.com/x/y/z?a=b
unless
x == assets
The context here is a CDN that makes origin requests to assets.example.com. The assets.example.com sub-domain shares the same DocumentRoot, and therefore the same robots.txt as example.com. So, it is currently theoretically possible to access any page vai the assets.example.com sub-domain instead of example.com. I would like to redirect everything under the assets.example.com sub-domain except actual assets (which are all under the /assets/ directory).
Here you go – I tested this with Apache 2.2. It should work with any recent version.
The logic here is that rewrite conditions are AND’ed together. It simply walks through the things that need to be true to do the redirect. First it tests if the first path segment is not /assets. Then it tests if the hostname is assets.example.com. If both of those are true, then it does a permanent redirect and ends the ruleset.