[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Generar páginas dinámicamente con lisp y apache



Lo prometido es deuda.
He cambiado el título del post (el asunto) para facilitar la búsqueda a alguien con el mismo problema que yo. Yo no quiero usar un modulo-extraño-de-comunicacion-de-apache-con-lisp ni nada por el estilo. Sólo quiero "Generar páginas dinámicamente con lisp y apache". La solución elegida pasa por convertir los fuentes de clisp (common-lisp) en ejecutables con

chmod a+x *.lisp

y añadiendo como primera línea de los archivos:

#!/usr/bin/clisp

Así, podemos comprobar que el fichero en lisp se ejecuta correctamente:

Romeo:/home/rober# ls -l /var/www/lisp/prueba.lisp
-rwxr-xr-x  1 root root 43 2005-07-02 20:59 /var/www/lisp/prueba.lisp

Romeo:/home/rober# cat /var/www/lisp/prueba.lisp
#!/usr/bin/clisp
(format t "hola, mundo")

Romeo:/home/rober# /var/www/lisp/prueba.lisp
hola, mundo

Ahora, en /etc/apache/httpd.conf añadimos las siguientes lineas

Romeo:/home/rober# head -905 /etc/apache/httpd.conf | tail -4
<Location /lisp>
 Options +ExecCgi
 AddHandler cgi-script .lisp
</Location>

que, para una carpeta concreta, añade permisos de ejecución para los CGIs, que debe ir acompañada de los permisos de ejecución de los archivos en el sistema. Además, elige cgi-script como manejador para los archivos acabados en .lisp. Es *importante* que las primeras lineas que el script escriba por stdout (con lisp usando format o print) sean "content-type: text/html" sin las comillas, o especificar otro tipo si el script genera otra cosa que no sea html. Después, se debe dejar una línea en blanco, o sea, usar *DOS* saltos de linea en lisp:

(format t "~%~%" )

después se interpreta que el resto de la salida por pantalla debe ser enviada. Podemos hacer lo mismo para los public_html de cada usuario (notese el ExecCGI en la linea Options y el AddHandler):

Romeo:/home/rober# head -355 /etc/apache/httpd.conf | tail -20
<IfModule mod_userdir.c>
    UserDir public_html
#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCgi
        AddHandler cgi-script .lisp
        <Limit GET POST OPTIONS PROPFIND>
            Order allow,deny
            Allow from all
        </Limit>
        <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
            Order deny,allow
            Deny from all
        </Limit>
    </Directory>
</IfModule>

Para rematar añadimos index.lisp al final de lista del DirectoryIndex para que un archivo index.lisp sirva de archivo inicial si no se especifica ninguno...

Romeo:/home/rober# head -363 /etc/apache/httpd.conf | tail -3
<IfModule mod_dir.c>
DirectoryIndex index.html index.htm index.shtml index.cgi index.php index.lisp
</IfModule>

Demostración de funcionamiento:

rober@Romeo:~/public_html$ ls -l index.lisp
-rwxr-xr-x  1 rober rober 106 2005-07-02 21:06 index.lisp

rober@Romeo:~/public_html$ cat index.lisp
#!/usr/bin/clisp
(format t "content-type: text/html")
(format t "~%~%" )
(format t "hola, soy rober!" )

rober@Romeo:~/public_html$ ./index.lisp
content-type: text/html

hola, soy rober!

rober@Romeo:~/public_html$ lynx --dump -nolist localhost/~rober

   hola, soy rober!


Saludos a la lista!
PD: # apt-get install clisp apache

--
Rober Morales Chaparro
http://roberinworld.blogspot.com



Reply to: