Submission Chamber Logo

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)



Copyright © 2001-2006 Submission Chamber.
The Submission Chamber contains adult material and is intended for adults 18 years & over!
Duplication, publication or distribution of this site in part or in whole is strictly prohibited.