<-
Apache > Servidor HTTP > Documentación > Versión 2.4 > How-To / Tutoriales

Tutorial de Apache httpd: Introducción a los Server Side Includes

Idiomas disponibles:  en  |  es  |  fr  |  ja  |  ko 

Los Server Side Includes (Inclusiones en la parte Servidor) facilitan un método para añadir contenido dinámico a documentos HTML existentes.

Support Apache!

Consulte también

top

Introducción

Este artículo trata sobre los Server Side Includes, generalmente llamados SSI. En este artículo, hablaremos sobre cómo configurar su servidor para permitir SSI, y de técnicas básicas de SSI para añadir contenido dinámico a sus páginas HTML existentes.

Más adelante también hablaremos de algunas técnicas más avanzadas que pueden usarse con SSI, tales como declaraciones condicionales en sus directivas SSI.

top

¿Qu?son los SSI?

SSI (Server Side Includes) son directivas que se introducen en páginas HTML y son evaluadas por el servidor mientras éste las sirve. Le permiten añadir contenido generado de manera dinámica a sus páginas HTML existentes sin tener que servir una página entera a través de un programa CGI, u otra tecnología para generar contenido dinámico.

Por ejemplo, podría colocar una directiva en una página existente de HTML de esta manera:

<!--#echo var="DATE_LOCAL" -->

Y, cuando se sirve la página, este fragmento ser?evaluado y sustituido con su resultado:

Tuesday, 15-Jan-2013 19:28:54 EST

La decisión sobre cuándo usar SSI, o de cuándo generar una página al completo con algún programa, suele depender generalmente de la cantidad de contenido estático que contiene, y cuánto de esa página tiene que ser recalculado cada vez que ésta se sirve. SSI es un buen método para añadir pequeñas partes de información, tales como la hora actual - como se ha mostrado más arriba. Pero si la mayoría de su página se tiene que generar en el momento en el que se est?sirviendo, necesita buscar otra opción más adecuada que no sea SSI.

top

Configurar su servidor para permitir SSI

Para permitir SSI en su servidor, debe tener la siguiente directiva en su fichero apache2.conf , o en un fichero .htaccess:

Options +Includes

Esto le dice a Apache que quiere permitir que se examinen los ficheros buscando directivas SSI. Tenga en cuenta que la mayoría de las configuraciones contienen múltiples directivas Options que pueden sobreescribirse las unas a las otras. Probablemente necesitar?aplicar Options al directorio específico donde quiere SSI activado para asegurarse de que se evalúa en último lugar y por tanto se acabar?aplicando.

No todos los ficheros se examinan buscando directivas SSI. Usted Le tiene que indicar a Apache qu?ficheros se tienen que examinar. Hay dos formas de hacer esto. Puede decirle a Apache que examine cualquier fichero con una extensión determinada, como por ejemplo .shtml, con las siguientes directivas:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Una desventaja de este método es que si quisiera añadir directivas SSI a una página ya existente, tendría que cambiar el nombre de la página, y todos los enlaces que apuntasen a esa página, todo para poder darle la extensión .shtml y que esas directivas sean interpretadas.

El otro método es usar la directiva XBitHack :

XBitHack on

XBitHack le dice a Apache que examine ficheros buscando directivas SSI si los ficheros tienen el bit de ejecución configurado. Asi que para añadir directivas SSI a una página existente, en lugar de tener que cambiarle el nombre, solo tendría que convertirla en ejecutable usando chmod.

chmod +x pagename.html

Una breve recomendación de qu?no hay que hacer. Ocasionalmente vemos gente recomendar que le diga a Apache que examine todos los ficheros .html para activar SSI, para no tener que lidiar renombrando los ficheros a .shtml. Quizás estas personas no hayan oido hablar de XBitHack. Lo que hay que tener en cuenta, es que haciendo eso, est?pidiendo al Apache que lea cada uno de los ficheros que manda al cliente, incluso si no contenien directivas SSI. Esto puede ralentizar bastante el servidor, y no es una buena idea.

Por supuesto, en Windows, no hay tal cosa como la configuración del bit de ejecución, as?que esto limita las opciones un poco.

En su configuración por defecto, Apache no envía la fecha de última modificación o la longitud de contenido de páginas SSI porque es dificil calcular estos valores para contenido dinámico. Esto puede impedir que se cachee un documento, y dar como resultado en apareciencia un rendimiento más lento del cliente. Hay dos maneras de solucionar esto:

  1. Usando la configuración XBitHack Full. Esto le indica a apache que determine la fecha de última modificación mirando sólo la fecha del fichero que se ha solicitado originalmente, obviando la modificación de cualquier otro fichero al que se hace referencia mediante SSI.
  2. Use las directivas facilitadas por mod_expires para configurar una expiración específica de tiempo en sus ficheros, y as?hacer saber a proxies o navegadores web que es aceptable cachearlos.
top

Directivas SSI básicas

Las directivas SSI tienen la sintaxis siguiente:

<!--#function attribute=value attribute=value ... -->

Se formatean como comentarios HTML, as?si no tiene SSI habilitado correctamente, el navegador las obviar? pero todavía serán visibles en el fichero HTML. Si tiene SSI configurado correctamente, la directiva ser?reemplazada con su propio resultado.

Esta función es una de tantas, y hablaremos de algunas de ellas más adelante. Por ahora, aqu?mostramos unos ejemplos de lo que puede hacer con SSI.

La fecha de hoy

<!--#echo var="DATE_LOCAL" -->

La función echo sencillamente muestra el valor de una variable. Hay muchas variables estándar que incluyen un conjunto de variables de entorno disponibles para programas CGI. También puede definir sus propias variables con la función set.

Si no le gusta el formato en el que se imprime la fecha, puede usar la función config, con un atributo timefmt para modificar ese formato.

<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" -->

Fecha de modificación del fichero

La última modificación de este documento <!--#flastmod file="index.html" -->

Esta función también est?sujeta a configuraciones de formato de timefmt.

Incluyendo los resultados de un programa CGI

Este es uno de los usos más comunes de SSI - para sacar el resultado de un programa CGI, tal y como ocurre con el que fuera el programa favorito de todos, un ``contador de visitas.''

<!--#include virtual="/cgi-bin/counter.pl" -->

top

Más ejemplos

A continuación hay algunos ejemplos específicos de cosas que puede hacer con SSI en sus documentos HTML.

¿Cuándo fue modificado este documento?

Antes mencionamos que puede usar SSI para informar al usuario cuando el documento ha sido modificado por última vez. Aun as? el método actual para hacerlo se dej?en cuestión. El código que se muestra a continuación, puesto en un documento HTML, pondr?ese sello de tiempo en su página. Por descontado, tendr?que tener SSI habilitado correctamente, como se indic?más arriba.

<!--#config timefmt="%A %B %d, %Y" -->
Ultima modificación de este fichero <!--#flastmod file="ssi.shtml" -->

Obviamente, necesitar?sustituir el nombre de fichero ssi.shtml con el nombre real del fichero al que usted hace referencia. Esto puede ser inconveniente si solo est?buscando un trozo genérico de código que pueda copiar y pegar en cualquier fichero, asi que probablemente necesite usar la variable LAST_MODIFIED en su lugar:

<!--#config timefmt="%D" -->
Última modificación de este fichero <!--#echo var="LAST_MODIFIED" -->

Para más detalles sobre el formato timefmt, vaya a su buscador favorito y busque strftime. La sintaxis es la misma.

Incluyendo un pie de página estándar

Si gestiona un sitio que tiene más de unas cuantas páginas, probablemente se de cuenta de que modificar todas esa páginas es un auténtico engorro, especialmente si trata de mantener una apareciencia homogénea en todas ellas.

Si usa un Include de fichero para la cabecera y/o pie de página puede reducir la carga de trabajo de estas actualizaciones. Solo tiene que hacer un sólo pie de página, y después incluirlo en cada página con el comando SSI include. La función include puede determinar qu?fichero incluir cuando usa el atributo file, o el atributo virtual. El atributo file es una ruta de fichero, relativa al directorio actual. Eso significa que no puede ser una ruta de fichero absoluta (que comienza con /), ni tampoco puede contener ../ como parte de la ruta. El atributo virtual es probablemente más útil, y debería especificar una URL relativa al documento que se est?sirviendo. Puede empezar con una /, pero debe estar en el mismo servidor que el fichero que se est?sirviendo.

<!--#include virtual="/footer.html" -->

Frecuentemente combinaremos las dos últimas, poniendo una directiva LAST_MODIFIED dentro de un fichero de pie de página que va a ser incluido. Se pueden encontrar directivas SSI en el fichero que se incluye, las inclusiones pueden anidarse - lo que quiere decir, que el fichero incluido puede incluir otro fichero, y as?sucesivamente.

top

¿Qu?más puedo configurar?

Además de poder configurar el formato de la hora, también puede configurar dos cosas más.

Generalmente, cuando algo sale mal con sus directivas SSI, obtiene el mensaje (ha ocurrido un error procesando esta directiva)

[an error occurred while processing this directive]

Si quiere cambiar ese mensaje por otra cosa, puede hacerlo con el atributo errmsg para la función config:

<!--#config errmsg="[Parece que no sabe cómo usar SSI]" -->

Afortunadamente, los usuarios finales nunca verán este mensaje, porque habr?resuelto todos los problemas con sus directivas SSI antes de publicar su página web. (¿Verdad?)

Y puede configurar el formato en el que los tamaños de fichero se muestran con el formato sizefmt. Puede especificar bytes para un recuento total en bytes, o abbrev para un número abreviado en Kb o Mb, según sea necesario.

top

Ejecutando comandos

Puede usar la función exec para ejecutar comandos. Y SSI puede ejecutar un comando usando la shell (/bin/sh, para ser más precisos - o la shell de DOS , si est?en Win32). Lo siguiente, por ejemplo, le dar?un listado de ficheros en un directorio.

<pre>
<!--#exec cmd="ls" -->
</pre>

o, en Windows

<pre>
<!--#exec cmd="dir" -->
</pre>

Notar?un formato estraño con esta directiva en Windows, porque el resultado de dir contiene la cadena de caracterers ``<dir>'' ,que confunde a los navegadores.

Tenga en cuenta de que esta característica es muy peligrosa, puesto que ejecutar?cualquier código que est?especificado con la etiqueta exec. Si tiene una situación en la que los usuarios pueden editar contenido en sus páginas web, tales como por ejemplo un ``registro de visitas'', asegúrese de tener esta característica deshabilitada. Puede permitir SSI, pero no la característica exec, con el argumento IncludesNOEXEC en la directiva Options.

top

Técnicas avanzadas de SSI

Además de mostrar contenido, SSI en Apache da la opción de configurar variables y usar esas variables en comparaciones y condicionales.

Configurando Variables

Usando la directiva set, puede configurar variables para su uso posterior. La sintaxis es como sigue:

<!--#set var="name" value="Rich" -->

Además de configurar valores literales como esto, puede usar cualquier otra variable, incluyendo variables de entorno o las variables que se han mencionado antes (como por ejemplo LAST_MODIFIED) para dar valores a sus variables. Podr?especificar que algo es una vaiable, en lugar de una cadena de caracters literal, usando el símbolo del dolar ($) antes del nombre de la variable.

<!--#set var="modified" value="$LAST_MODIFIED" -->

Para poner el símbolo del dolar de manera literal en un valor de su variable tendr?que escapar el símbolo del dolar con una barra "\".

<!--#set var="cost" value="\$100" -->

Por último, si quiere poner una variable entre medias de una cadena de caracteres más larga, y se da la coincidencia de que el nombre de la variable se encontrar?con otros caracteres, y de esta manera se confundir?con otros caracteres, puedes poner el nombre de la variable entre llaves, y as?eliminar la confusión. (Es dificil encontrar un buen ejemplo para esto, pero con éste a lo mejor entiende lo que tratamos de transmitir.)

<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->

Expresiones condicionales

Ahora que tenemos variables, y somos capaces de comparar sus valores, podemos usarlas para expresar condicionales. Esto permite a SSI ser un cierto tipo de lenguaje de programación diminuto. mod_include provee una estrucura if, elif, else, endif para construir declaraciones condicionales. Esto le permite generar de manera efectiva multitud de páginas lógicas desde tan solo una página.

La estructura de este sistema condicional es:

<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->

Una test_condition puede ser cualquier tipo de comparación lógica - o bien comparando valores entre ellos, o probando la ``verdad'' (o falsedad) de un valor en particular. (Una cadena de caracteres cualquiera es verdadera si no est?vacía.) Para una lista completa de operadores de comparación, vea la documentación de mod_include.

Por ejemplo, si quiere personalizar el texto en su página web basado en la hora actual, puede usar la siguiente receta, colocada en su página HTML:

Good <!--#if expr="%{TIME_HOUR} <12" -->
morning!
<!--#else -->
afternoon!
<!--#endif -->

Cualquier otra variable (o bien las que defina usted, o variables de entorno normales) puede usarse en declaraciones condicionales. Vea Expresiones en el Servidor Apache HTTP para más información sobre el motor de evaluación de expresiones.

Con la habilidad de Apache de configurar variables de entorno con directivas SetEnvIf, y otras directivas relacionadas, esta funcionalidad puede llevarle a hacer una gran variedad de contenido dinámico en la parte de servidor sin tener que depender de una aplicación web al completo.

top

Conclusión

Desde luego SSI no es un reemplazo para CGI u otras tecnologías que se usen para generar páginas web dinámicas. Pero es un gran método para añadir pequeñas cantidaddes de contenido dinámico a páginas web, sin hacer mucho más trabajo extra.

Idiomas disponibles:  en  |  es  |  fr  |  ja  |  ko 

top

Comentarios

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.
°×С½ã͸ÌØÆÚÆÚ