# SHTML (SSI)

SHTML, também chamado de HTML com Server Side Include (SSI) é uma linguagem de marcação de hipertexto (códigos aplicados a um texto na internet) com suporte script no servidor, ou seja, uma linguagem de programação de websites que executa comandos no servidor Web, onde em seguida o resultado é exibido nos navegadores de internet. SHTML é baseado no servidor NCSA HTTPd. Útil para incluir o conteúdo de vários arquivos diferentes em uma página da Web, usando a diretiva #include, geralmente pode ser um código comum em todo as páginas de um portal, como um cabeçalho de página, rodapé de página e, menu de navegação. O SSI também contém diretivas de controle para recursos condicionais e diretivas para chamar programas externos. É suportado pelo Apache, LiteSpeed, nginx, IIS e, Jigsaw (W3C).
Para que um servidor da Web reconheça um arquivo HTML habilitado para SSI e, portanto, execute essas instruções, o nome do arquivo deve terminar com uma extensão especial: .stm, .shtm, .shtml, ou, se o servidor estiver configurado para definir o bit de execução dos comandos.

## Projeto

Por ser uma linguagem de programação e de marcação com design simples, o SSI suporta apenas um tipo de variável: o formato texto e, possui um fluxo de controle simples com suporte a comandos de escolha, mas os loops não são suportados, só podem ser feitos por recursão usando include ou redirecionamento HTTP. Sendo de fácil aprendizado e uso, o SSI é Turing-completo, diferente do processamento complicado das linguagens de programação mais ricas em recursos.
O SSI tem uma sintaxe simples: como por exemplo, usar um rodapé repetitivo . Uma página da web que exibe uma cotação diária, pode incluir um arquivo de cotação colocando o seguinte código na página: . Onde qualquer alteração no arquivo quote.txt, será exibido em todas as páginas que o incluem, exibirão a cotação diária mais recente. A inclusão não se limita a arquivos, também pode ser a saída de texto de um programa ou o valor de uma variável do sistema, como a hora atual por exemplo.
As diretivas são colocadas na forma de comentários HTML. Mas se o SSI não estiver habilitado, os usuários não verão os resultados das diretivas SSI na página web.

## Diretivas
### Comum

A seguir estão as diretivas SSI dos tempos do NCSA HTTPd (década de 1990). Algumas implementações não suportam todas.
Diretivas NCSA HTTPd SSI :
| Diretiva | Parâmetros | Descrição | Exemplo |
| include | arquivo ou virtual | Esta é a diretiva SSI mais usada. Permite que o conteúdo de um documento seja transcluído (adicionado integralmente) em outro. Este também pode ser um arquivo habilitado para SSI. O file ou parâmetros virtual especificam o arquivo (página HTML, arquivo de texto, script, etc.) a ser incluído. O Apache HTTPd suporta include. Se o processo não tiver acesso para ler o arquivo ou executar o script, a inclusão falhará. O parâmetro virtual trata de qualquer caminho de diretório como se fosse parte da URL, enquanto file trata de qualquer caminho de diretório como no sistema de arquivos subjacente. Ao usa-lo é proibido referenciar caminhos absolutos ou ../ para acessar um diretório pai. O Apache recomenda neste caso usar virtual. | <!--#include virtual="menu.cgi" --> <!--#include file="footer.html" --> |
| exec | cgi ou cmd | Esta diretiva executa um programa, script ou comando shell no servidor. O parâmetro cmd especifica um comando do lado do servidor; o parâmetro cgi especifica o caminho para um script CGI. The PATH_INFO and QUERY_STRING of the current SSI script will be passed to the CGI script, as a result "exec cgi" should be used instead of "include virtual". | <!--#exec cgi="/cgi-bin/foo.cgi" --> <!--#exec cmd="ls -l" --> |
| echo | var | Esta diretiva exibe o conteúdo de uma variável de ambiente HTTP especificada. Variables include HTTP_USER_AGENT, LAST_MODIFIED, and HTTP_ACCEPT. | Your IP address is: <!--#echo var="REMOTE_ADDR" --> |
| config | timefmt, sizefmt ou errmsg | Esta diretiva configura os formatos de exibição para a data, hora, tamanho do arquivo e mensagem de erro (retornada quando um comando SSI falha). | <!--#config timefmt="%y %m %d" --> <!--#config sizefmt="bytes" --> <!--#config errmsg="SSI command failed!" --> |
| flastmod e fsize | arquivo ou virtual | Essas diretivas exibem a data em que o documento especificado foi modificado a última vez, ou o tamanho do documento especificado. O parâmetros virtuais especificam o documento a ser usado. O parâmetro file define o documento em relação ao caminho do documento; o parâmetro virtual define o documento em relação à raiz do documento. | <!--#flastmod virtual="index.html" --> <!--#fsize file="script.pl" --> |

### Diretivas de controle

As diretivas de controle são posteriormente adicionadas ao SSI. Eles incluem o onipresente controle de fluxo if-elif-else-endif e escrita de variáveis, bem como recursos mais exóticos, como loops encontrados apenas em algumas implementações.
| Diretiva | Parâmetros | Descrição | Exemplo | Encontrado em |
| if elif else endif | exp | instrução if usada para testes de condição que podem determinar e gerar várias páginas lógicas a partir de uma única página física. elif é uma abreviação para else-if aninhado. else e endif não aceitam parâmetros. A sintaxe de expressão varia entre as implementações. Verificações de existência de variável e igualdade/regex são comumente suportadas. O Jigsaw usa expressões divididas em vários atributos. | <!--#if expr="${Sec_Nav}" --> <!--#include virtual="secondary_nav.txt" --> <!--#elif expr="${Pri_Nav}" --> <!--#include virtual="primary_nav.txt" --> <!--#else --> <!--#include virtual="article.txt" --> <!--#endif --> | Onipresente. |
| definir | var, valor | Define o valor de uma variável SSI. O Apache fornece parâmetros adicionais para codificações . | <!--#set var="foo" value="bar" --> | Apache, Nginx |
| printenv | | Esta diretiva gera uma lista de todas as variáveis SSI e seus valores, incluindo variáveis ambientais e definidas pelo usuário. Não possui atributos. | <!--#printenv --> | Apache |