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: