Server-Side Includes (SSI)
Server-Side Includes (SSIs) can be a very powerful tool on your web pages. They allow you to not only use template pages across your site but can process and show variables, allow function-like statements and even connect to databases. This comprehensive guide is designed both for beginners and as a reference for advanced users.
Note: For SSI to work you need a text file called
.htaccess in the directory you put your HTML file in. The file .htaccess
must have the following three lines in it:
Options Indexes FollowSymLinks Includes
AddType application/x-httpd-cgi .cgi
AddType text/x-server-parsed-html .html
Introduction to SSI+
Server side includes (SSI)s applied to an HTML
document, provide for interactive real-time features such as echoing current
time, conditional execution based on logical comparisons, querying or updating
a database, sending an email, etc., with no programming
or CGI scripts. An SSI consists of a special sequence of characters(tokens)
on an HTML page. As the page is sent from the HTTP server to the requesting
client, the page is scanned by the server for these special tokens. When
a token is found the server interprets the data in the token and performs
an action based on the token data. The format of a SSI token is as follows
:
<!--#'<tag><variable set> '--> where
: <!--# is the opening identifier, a SSI token always starts with this.
<tag> is one of the following: echo, include, fsize, flastmod, exec,
config , odbc, email, if, goto, label, break <variable set> is a set
of one or more variables and their values. The values allowed here and
dependent on the tag and are listed below each tag listed below. The format
of a variable set is as follows : <variable name> '=' '"' variable data
'"' <variable name2> '=' '"' variable data2 '"' <variable name n>
'=' '"' variable datan '"' "-->" is the closing identifier, a SSI token
always ends with this.
SSI tokens may contain special tags (subtokens)
which are dereferenced before evaluation of the SSI token takes place.
Subtokens maybe inserted any place in the SSI token. Subtokens are especially
useful when forming if, odbc, email,
and exec tokens (described below) that are based on
HTML form data returned from a remote client. The format of a subtoken
is as follows: '&&'<subtokendata>'&&' where: '&&'
is a reserved character sequence defining the beginning and end of the
subtoken <subtokendata> is any value allowed in an echo token.
The following is a list of the currently supported
SSI+ tags:
Echo tag provides for inserting
the data of certain variables into an HTML page.
Include tag provides for
inserting the contents of a file into the HTML page at the location of
the include token.
Fsize tag provides for inserting
the size of a given file into the HTML page at the location of the fsize
token.
Flastmod tag provides
for inserting the last modification date of a given file into the HTML
page at the location of the flastmod token.
Exec tag provides for executing
an external executable.
Config tag provides for
setting certain HTML output options.
Odbc tag provides for querying
and updating ODBC databases.
Email tag provides for sending
an email whenever an HTML page is accessed or an HTML form is submitted.
If tag provides for conditional
execution of SSI operations and conditional printing of HTML text based
on logical comparisons.
Goto tag provides for jumping
to a label token without executing any SSI code or
printing any HTML text between the goto token and label
token.
Label tag provides a place
for a goto or if goto token to jump
to.
Break tag provides for termination
of HTML documents at any point.
SSI Documents
An SSI+ document must have a file extension of
'.SHT' or '.SHTM'. For the sake of efficiency the HTTP server will only
scan those documents with the aforementioned extensions for SSI+ tokens.
EMail Tag
The email tag provides for sending an Email whenever
an HTML page is accessed or an HTML form submitted. The nature of the variables
below is defined in RFC 733. The variables 'fromhost', 'tohost', 'fromaddress'
and 'toaddress' are required, all others are optional.
fromhost defines the name of the smtp host
sending the mail.
tohost defines the name of the smtp host
the mail will be sent to.
fromaddress defines the email address
from party.
toaddress defines the email address of
the recipient party.
message defines the message body to be
sent.
subject defines the subject field of the
message to be sent.
sender defines the email address sending
party.
replyto defines the email address to which
replies should be sent.
cc defines the courtesy copy email addresses.
inreplyto defines the inreplyto field
of the message to be sent.
id defines the id field of the message
to be sent.
Example:
The following document send an email. Suppose
we have a form with datum : [First, Last, Middle Initial, Company, Address1,
Address2, City, State, Zip, Country, Phone, Fax, Request, Urgency, ReplyMethod;
Email, Subject, Message] we may post that form to an HTML document containing
the following fragment to send an email.
<!--#email fromhost=""www.theworld.com"tohost="mailbox.theworld.com"
message="First -&&First&&, Last - &&Last&&,
MI- &&Middle Initial&&, Company - &&Company&&,
Address - &&Address1&&, &&Address2&&, &&City&&,
&&State&&, &&Zip&&, &&Country&&,
Phone - &&Phone&&, Fax - &&Fax&&, Request
&&Urgency &&via &&ReplyMethod&&, Message
- &&Message&& "fromaddress="&&EMail&&"
toaddress="markw@mailbox.theworld.com"subject="WebMan - &&Subject&&"
sender="&&EMail&& "replyto="&&EMail&&"
cc=" "inreplyto="A WebMan Automated E-Mail" id="WebManEMail" -->
If Tag
The if tag provides for conditional execution
of SSI operations, and conditional printing of HTML text, based on logical
comparisons. The format of the if tag is : 'if' '"'<operand1>'"' <operator>
'"'<operand2>'"'<operation> where:
<operand1> is the first operand of a logical
comparison statement
<operand2> is the second operand of a logical
comparison statement
<operator> is the logical comparison method
['==', '!=','<', '>', '!<', '!>']
<operation> is the action to take if the logical
comparison evaluates to TRUE ['goto ', 'print', 'error', 'break ', 'errorbreak',
'printbreak']
The operands may be any string or number (integer
or floating point). In the event that both operands are numbers the comparison
will be based on the value of the numbers. In the event that one or both
of the operands and not numbers, the comparison will be based on the alphabetic
order of the operands.
The special case of the NULL operand is defined
by two quotes with no characters between them. The NULL operand may used
to check for the existence of form data from the remote client (see example
below).
The operator defines what kind of comparison is
performed on the operands:
== The equalto operator evaluates to TRUE
if the operands are equal to each other.
!= The notequalto operator evaluates to
TRUE if the operands are not equal to each other.
< The lessthan operator evaluates to
TRUE if operand1 is less than operand2.
> The greaterthan operator evaluates to
TRUE if operand1 is greater than operand2
!< The notlessthan operator evaluates
to TRUE if operand1 is not less than operand2
!> The notgreaterthan operator evaluates
to TRUE if operand1 is not greater than operand2
hasstring The hasstring operator returns
TRUE is the text string in operand2 is found in the operand1 string.
In the event that the logical comparison evaluates
to FALSE, nothing happens, If the logical comparison evaluates to TRUE
then one of the following operations may be performed:
'goto ' causes a jump to a label token (see below).
The format of the goto tag is:
'goto ' <label >
where <label > is the name of a label defined
in a subsequent label tag (see below).
'print' causes text to be printed. The format
of the print tag is:
'print' <text>
where <text> is any HTML text or tag.
'error' causes the current config..error message
to be printed.
'break ' causes termination of the HTML document
transmission to the client.
'errorbreak' causes the current config ..error
message to be printed, and then causes termination of the HTML document
transmission to the client.
'printbreak' causes text to be printed, and then
causes termination of the HTML document transmission to the client. The
format of the printbreak tag is the same as the format of the print tag.
Example:
The following document fragment compares two numbers,
if the operands are not equal then a goto will jump to a label.
<!--#if "10" != "20" goto test label -->
<p>This should not print <!--#label ="testlabel " --> <p>This
should print
Example:
The following document fragment demonstrates conditional
execution based on data delivered from an HTML form. Suppose we have two
form datum called 'formdata1' and 'formdata2' and we wish to compare them.
The following document fragment compares the two operands, if the operands
are equal then a goto will jump to a label. Otherwise the next line will
print and the document will terminate on a break token (see below).
<!--#if "&&formdata1&&"
== "&&formdata2&&" goto testlabel --> <P>The operands
are not equal. <!--#break --> <!--#label ="testlabel " --> <P>operands
are equal.
Example:
The following document fragment prints two different
statements depending on whether or not the client agent is NCSA Mosaic.
<!--#if "&&HTTP_USER_AGENT&&"
hasstring "Mosaic" goto mosaiclabel --> <P>You are not using Mosaic
<!--#goto ="defaultlabel" --> <!--#label ="mosaiclabel" --> <P>You
are using Mosaic <!--#label ="defaultlabel" -->
Example:
Suppose we have a form with amongst other things
a field named "BOO" and we wish to make sure that the remote client user
enterted data into the "BOO" field before submitting the form. The following
document fragment checks for the presence of data in the "BOO" field, if
data exists then nothing happens, if data does not exist then a message
will be displayed and the document will terminate.
<!--#if "BOO" == "" printbreak "<P>You
must provide data for the BOO field, please resubmit." -->
ODBC Tag
The odbc tag provides for querying and updating
odbc databases. Four variables are defined for the odbc token; 'debug',
'connect', 'statement', and 'format'.
DEBUG
The debug variable is used to set the SSI+ engine
into debug mode. Debug mode provides diagnostics of a highly detailed nature
from both the SSI engine itself and the local ODBC engine. Debug messages
appear on the returned HTML document at the position at which the errors
occur. The debug variable should be used only for development and must
be removed before production. When the debug variable is present a warning
message will appear indicating it's presence, this message is benign and
will not affect any other aspect of the SSI+ engine.
The format of the debug variable is : 'debug='"<debugstring>"'
where;
<debugstring> is any string and is reserved
for future use.
CONNECT
The connect variable is used to connect to a
pre-existing odbc data source, to allow for subsequent statement tag operations
on that data source.
The format of the connect variable is
'connect="'<datasource>','<username>','<password>'"'where
;
<datasource> is the name odbc data source
as defined on the local system in the odbc configuration utility. CAUTION!
the account under which the server is run must be granted permission to
access the data source.
<user name> is the name which to log into
the data source.
<password> is the password with which to access
the data source.
Example:
To connect to a data source called 'odbcsht' as
user 'dufus' and password 'dorkboy', one would use the following statement:
STATEMENT
The statement variable is used to submit a Transact
SQL statement to the odbc data source. The format of a statement variable
is as follows:
'statement="'<SQLStatement>'"',where:
<SQL Statement> is any Transact SQL statement
as defined in odbc and SQL reference text and help files.
Example:
Suppose one wanted to query the 'CUSTOMERS' table
from the above connected 'odbcsht' database to return all rows and display
each row on a separate line. One may use the following sequence of statements:
Connect to the database with a connect token
as described above.
Setup the output format with a statement token
as described below.
Execute the query: <!--#odbc statement="SELECT
NAME, AGE, VISCOSITY FROM CUSTOMERS ORDER BY 3, 2, 1" -->
Continue to SSI (page 2)
|