| Server Side Includes 
 To a webmaster, Server Side Includes are bliss. Website Manager is an SSI manager. SSI allows you to include a text file in an unlimited number of web pages. So when it comes time to update all those web pages, you can make the change by editing just the one text file. You will need to ensure your server supports SSI. If your server is a unix/linux server, you can be pretty sure it supports SSI. SI requires the use of Apache Server software. Most unix/linux server use Apache. Some Windows server also use Apache, but most of them use IIS (Internet Information Server). The server software is not something you can change, and because it runs th entire server (including other people's web sites) your host will also refuse to change it for you. They may instead be kind enough to move your site to anther one of their servers which does use Apache.
 
 Most people will tell you that to use SSI, you must name the page with a "shtml" extension. While that may be the case initially, you can set the server to also accept and parse regular "htm" or "html" files. The draw back is that each time any page is called, it will be first examined to see if parsing is neccessary. This usually takes an extra millionth of a second. Parsing means the server reads the structure of a file prior to serving it, to determine whether any dynamic content is required.
 
 SSI Basics
 
 The most common use for SSI is to include files which allow for site wide updates. To achieve this, you need to add an SSI command to each of your web pages. The command tells the page where to find the file that should be included. You may have noticed that our menu (on the left) is precisely the same across our entire web site. That's because it uses SSI. Here is the simple command :
 
 <!--#include virtual="/header.txt" -->
 
 We have placed something similar to the above command in everyone of our web pages. Each time someone request one of our web pages, it tells the web server to fetch the contents on a file named "header.txt" and include in the web page. The contents of "header.txt" are placed exactly where the SSI command is. The preceding slash "/" tells the server that the "header.txt" file is located in the web directory (the same directory that houses the home page). You can also call includes from other directories, by entering the correct path from the web directory or a relative path. For example, if your files to be included where in a folder named "includes" which was a folder in the web directory, you would use something like the following :
 
<!--#include virtual="/includes/header.txt" -->
 You can add that command to any number of your web pages. Each page would then print the contents of "header.txt" into itself. Then, when you changed the content of "header.txt" all pages that use the above SSI command would also be updated. Imagine the time you would save if you had 1,000 web pages and need to correct a spelling mistake, or add a new link to your menu.
 
Allowing HTM and HTML files to be parsed 
 Somewhere on your server there may be a file named ".htaccess". Files that begin with a period, are usually hidden from view when you FTP in to your server. If you can't see one in your web folder, it's either because it's located above the web folder or your FTP client doesn't show them. Most FTP clients can be set to show all files. WS_FTP makes it real easy. Cute FTP is a little confusing as it seems to show the entire web site and all of it's folders and files in one screen. To view all files using WS_FTP, from the top menu bar select :
 
 Sites -> Organize sites -> Right click on site name -> Properties -> Start up Tab
 
 In the "Remote file mask" text box enter "-al". That's "dash A L" without quotes. That's a unix command for "list all files". Now see if you can find a .htaccess file. If you cannot, it's safe to create your own. If you're using .htaccess to protect web directories or for custom error pages, it pays to first find out where the .htaccess files are located to ensure you do not overwrite directives contained within them.
 
 To create your own ".htaccess" file enter the following :
 
AddType text/html .shtml .shtm .htm .html AddHandler server-parsed .shtml .shtm .htm .html
 
 If you'd like to use your own custom error pages, you may also enter :
 
ErrorDocument 401 /auth.htmlErrorDocument 404 /missing.html
 ErrorDocument 405 /invalid_method.html
 ErrorDocument 500 /server.html
 
 Save the file and upload it to your web folder (the folder that contains your home page). If you used the custom error page directives, you need to create those files also (missing.html etc) and upload them to your web folder. So, for example, when a page cannot be found, (404 error), the user will be directed to "missing.html" where you can present them with links to your home page or instructions on what course they can take next.
 
 The Handler directives tell the server to parse .shtml, .shtm, .htm and .html files. You should now be able to add SSI commands to any of those types of files. These handler directives are usually stored in the server's config file (httpd.conf).
 
Advanced SSI 
 SSI is an advanced language with many commands and statements available. I will cover a small portion of them here. First thing to note is that the comment terminator (-->) should be preceded by a space to ensure it's not treated as SSI syntax.
 
 As stated above, in SSI Basics, you can use the "include" command to include files. You can also use the "exec" command to execute regular cgi scripts. It can also include files, but unless you're executing a cgi script, you should always use "include". It's faster and safer. For example,
 
 <!--#exec cgi="/includes/test.cgi" -->
 
 would execute a cgi script named "test.cgi" which is located in your web folder. As with all cgi scripts, "test.cgi" should be CHMOD to 755 (or the correct execution permissions). The directory that contains the cgi script, must also be enabled for cgi scripts (your cgi-bin for example).
 
 You can also use the "echo" command to dynamically print content such as dates and variables :
 
 The current date in Greenwich Mean Time
 <!--#echo var="DATE_GMT" -->
 Friday, 31-Oct-2025 09:45:10 GMT
 
The current date in the local (server's) time zone<!--#echo var="DATE_LOCAL" -->
 Friday, 31-Oct-2025 05:45:10 EDT
 
The name of the current document<!--#echo var="DOCUMENT_NAME" -->
 ssi.html
 
The (web) path and name of the current document<!--#echo var="DOCUMENT_URI" -->
 /tutorials/howto/ssi.html
 
The date the current document was last modified<!--#echo var="LAST_MODIFIED" -->
 Sunday, 22-Jul-2012 04:05:40 EDT
 
The browser type<!--#echo var="HTTP_USER_AGENT" -->
 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
 
The remote host (yours)<!--#echo var="REMOTE_HOST" -->
 (none)
 
The IP address (yours)<!--#echo var="REMOTE_ADDR" -->
 216.73.216.21
 
The request method (GET, PUT or POST)<!--#echo var="REQUEST_METHOD" -->
 GET
 
Some other variables you can experiment with are : 
 
DATE_LOCALDATE_GMT
 DOCUMENT_NAME
 DOCUMENT_PATH_INFO
 DOCUMENT_ROOT
 DOCUMENT_URI
 GATEWAY_INTERFACE
 HTTP_ACCEPT
 HTTP_ACCEPT_ENCODING
 HTTP_ACCEPT_LANGUAGE
 HTTP_CACHE_CONTROL
 HTTP_HOST
 HTTP_IF_MODIFIED_SINCE
 HTTP_REFERER
 HTTP_USER_AGENT
 HTTP_X_FORWARDED_FOR
 LAST_MODIFIED
 PATH
 QUERY_STRING
 REMOTE_ADDR
 REMOTE_PORT
 REQUEST_METHOD
 REQUEST_URI
 SCRIPT_FILENAME
 SCRIPT_NAME
 SCRIPT_URI
 SCRIPT_URL
 SERVER_ADDR
 SERVER_ADMIN
 SERVER_NAME
 SERVER_PORT
 SERVER_PROTOCOL
 SERVER_SIGNATURE
 SERVER_SOFTWARE
 UNIQUE_ID
 USER_NAME
 
 
or print the entire environment as returned by your server using : 
 
<!--#printenv -->
 
You can also set variables (in Apache 1.2 and later), then conditionally display data, such as printing tags only if the browser is Internet Explorer.
 
<!--#set var="Agent" value="${HTTP_USER_AGENT}" -->
 
Print it 
 
<!--#echo var="Agent" -->
 
Check the variable to see if it contains "MSIE", and if true, print today's date, else print some text that says it's not MSIE.
 
<!--#if expr="$Agent = /MSIE/" --> 
 
<!--#echo var="DATE_GMT" -->
 
<!--#elif expr="$Agent != /MSIE/" -->
You are not using MSIE
 
<!--#endif --> 
 When testing expressions, the usual escape rules apply. For example, if you were looking to match a string the contains the dollar sign, you would need to escape the dollar sign with a backslash.
 
<!--#if expr="$a = \$" -->
 
To disambiguate variables that could be interpreted in more ways than one (because the dollar sign is not required in variables and may be treated as a string), you can use the dollar sign and braces as in :
   
<!--#set var="UserAgent" value="Your Browser is ${HTTP_USER_AGENT}" -->
 
The basic flow control for if,else conditions (available in Apache 1.2 and later) is as follows :
 
<!--#if expr="condition" --><!--#elif expr="condition" -->
 <!--#else -->
 <!--#endif -->
 
 
The if condition is evaluated and if true, then any text until between it and the next condition is printed to the web page. The elif or else conditions (both optional) are be used the print text text to the web page if the if was not met. The endif condition terminates the conditional block and is required.
 
Conditions have the following meanings and can use any of the following operators:
 
<!--#if expr="$Var" --> True if $Var has any value at all
 
<!--#if expr="$Var = hello" --> True if $Var equal "hello". Keep in mind, that if the string you're trying to match has a space, you must quote and escape the string as in 
 
<!--#if expr="$Var = \"hello there\"" -->
 
or use single (nested) quotes without escapes. Note that if using single quotes, they must be nested within double quotes.
 
<!--#if expr="$Var != hello" --> True if $Var does not equal "hello"
 
<!--#if expr="$Var = /hello/" --> True if $Var contains "hello" anywhere within the entire value of the variable. Similar to Perl and Javascript regular expressions
 
<!--#if expr="$Var = /hello/ && $Var = /there/" --> True if $Var contains both "hello" and "there" anywhere within the entire value of the variable.
 
<!--#if expr="$Var = /hello/ || $Var = /there/" --> True if $Var contains "hello" or "there" anywhere within the entire value of the variable.
 
If you're familiar with Unix, Perl or JavaScript programming and regular expressions, feel free to experiment with other operators you're aware of such as parenthesis. There are many similarities in regular expression syntax that apply to these languages.
  
 |