More Busriders Shenanigans, Probably
Oct. 19th, 2024 04:26 pmSo if you have access to an Apache2 server that allows .htaccess
overrides and has mod_actions
turned on, you can make a single CGI script take over the whole URL hierarchy for an entire site. (Or just for a subtree of it, although the app would need to be aware and ready for that.)
In short, you make a new directory called __internal
(or something) at the top of your site, and put your CGI executable in there with a filename of my-app.cgi
(or something). Then you make TWO .htaccess
files.
The root-level .htaccess
disables special handling for bare directories, then tells the server to unconditionally use your CGI script to handle every URL pointing into your site, without consideration for whether a path would otherwise aim at a file on disk.
# Root-level .htaccess file
Options -Indexes
DirectoryIndex disabled
Action my-app "/__internal/my-app.cgi" virtual
SetHandler my-app
AcceptPathInfo on # that's the default, but still
That CGI path in the Action
directive needs to be a URL path pointed at somewhere reachable on your site, rather than a path on disk. That's kind of odd, and it hung me up for a while when I was trying to get this working! But the upshot is, we now need a second .htaccess
in that __internal
directory that un-does everything we did in the root-level .htaccess
so that the server can actually resolve that script. (Otherwise you end up in a recursive loop and the site doesn't work.)
# .htaccess file in /__internal
Options +ExecCgi -Indexes
SetHandler None
AddHandler cgi-script .cgi
Ta-daaaa! Now your program can handle all the top-level routing for your site, using CGI vars like REQUEST_URI
to reconstruct the original request and do your routing. (And don't worry about needing to keep __internal
private or anything, it just needed some kind of weird name to avoid trampling on any of your app's real URL paths.)