Templating without templates - server-side includes
When you have more than a handful of pages on your site updating anything shared between them becomes tedious. Things like your site menu, a copyright footer if you have one, perhaps the default header and meta tags.
There were options. You could use a tool like Macromedia Dreamweaver, GoLive CyberStudio, HoTMetaL, or HotDog (one of New Zealand’s .com boom success stories!) to author all your HTML and copy the files you could use their built-in templating features, or copy/paste the changes.
If you weren’t rich enough to use those tools - they did cost quite a bit - you’d either have to roll your own using local scripts, or rely on server-side features.
The most obvious is PHP. This is one of the reasons PHP was created, PHP originally stood for Personal Home Page and was a CGI script. The original PHP syntax was very different to what ended up being PHP3, in fact it was very similar to what I’m about to use.
I’ve updated my website with all the pages, common elements brought to you by Server-side Includes!
Server-side Includes
These date back to the NCSA httpd from 1993, one of the first web servers, and are still supported by modern servers like nginx. At their most basic server-side includes, or SSI, are web server feature that looks for special HTML comments and replaces them with the contents of another file.
<!--#include virtual="./header.html" -->
This tells the web server to resolve the path ./header.html
and substitute it in. virtual
means use the HTTP path resolution rather than filesystem paths. Most web servers prohibit using file
with an absolute path or with any ../
in the path. This is because the web server often has permission to read many other user’s home directories, so it’s possible to get around file permissions with this.
virtual
also allows you to reference CGI scripts. I could have implemented my counter to return text and used <!--#include virtual="~thea/cgi-bin/counter.cgi" -->
.
Files included this way may also be processed for SSI themselves, resulting in several levels of include if you go that far. Most servers have a limit on how deeply nested includes can be.
Apache also allows you to configure CGI scripts to have their result processed by the SSI module, though this is not the default setting. Apache also has an additional option called XBitHack
, which lets you set the execute bit on your HTML rather than renaming to .shtml
. You can also configure it to process all files for include directives, but this has performance implications. Or at least it did in 1999.
Variables
Typically the query string and some request and server details are exposed as variables.
Apache’s implementation SSI has rudimentary support for setting variables, <!--#set var="title" value="About" -->
. Interpolation is also available to build variables out of other variables. You can then <!--#echo var="title" -->
to get the value.
SSI does not have any form of namespacing, but whether variables set in one file are visible in another depends on the server. In Apache they are, so I used variables to pass down the title. Normally included pages have access to variables set in the parent.
Conditionals
Most SSI implementations have basic conditionals - <!--#if -->
, <!--#else -->
. I haven’t had the need to use them, but they could be used to include different files based on browser user-agent. This was quite handy when you needed very different styles for IE and Netscape.
As many servers supplied the query string to the page you could make a slightly dynamic page using SSI conditionals and query strings. Some nefarious people used this to implement loops
Error handling
[an error occurred while processing this directive]
That’s pretty much all you get! Unless you’re the server admin and can check the logs you’re kind of stuck.
And that’s it
Server-side Includes are a very basic tool, but they can be very powerful. However we moved on to more powerful things, like the aforementioned PHP, which I may just cover soon.
Comments
Post a comment