viernes, 9 de julio de 2010

Debian Lenny: Código PHP + APACHE2 + DAV


El uso de DAV para gestionar los archivos de sitios web en servidores como Apache2 y Ligthy es una combinación muy útil y más segura que FTP.

El problema que se me ha presentado consiste en que tratando de descargar los archivos PHP de uno de los sistemas publicados, los archivos se descargaban con el resultado de la ejecución de los archivos PHP, es decir, código HTML.

En realidad, lo que debía ocurrir era que se descargaran los archivos crudos con el código PHP.

Luego de investigar un poco, conseguí esta información en el portal de APACHE

"
One common request is to use mod_dav to manipulate dynamic files (PHP scripts, CGI scripts, etc). This is difficult because a GET request will always run the script, rather than downloading its contents. One way to avoid this is to map two different URLs to the content, one of which will run the script, and one of which will allow it to be downloaded and manipulated with DAV."

Entonces, lo que hice fué modificar el archivo relacionado con el virtualhost de la siguiente manera:
  • vim /etc/apache2/sites-available/sitioweb
    ...
    Alias /fvtenis "/var/www/sitio/aplicacion/"

    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all

    ...
  • Y agregué las directivas correspondientes al acceso vía DAV pero con un alias diferente:

    Alias /sitio-fuentes "/var/www/sitio/aplicacion/"

    Dav On
    ForceType text/plain
    AuthType Basic
    AuthName "SITIO: Archivos fuentes."
    AuthUserFile /etc/apache2/dav_auth/dav-auth-claves
    Require valid-user

Como se puede apreciar, hay varios trucos que aplican acá:

En primer lugar, se emplea la directiva "directory" para ofrecer los archivos en los directorios que deben ser ejecutados por el compilador de PHP.

En segundo lugar, se creó un alias llamado "sitios-fuentes" que define la parte final del url para acceder con el cliente DAV.

En mi caso utilizo "cadaver" y la forma de conectarme es:

cadaver http://miweb/sitio-fuentes/

En tercer lugar, obligo a que la entrega de los archivos sea en texto plano a través de la directiva "ForceType".

En cuarto lugar, empleo un archivo de autenticación DAV llamado "dav-auth-claves" creado con la herramienta "htpasswd".

Luego de estos cambios, pude verificar que la descarga de los archivos a través de "cadaver" empleando el comando "get" efectivamente venían con el código PHP completo.

Espero sea de utilidad!

José Gregorio.

Fuentes consultadas:

1. http://httpd.apache.org/docs/2.0/mod/mod_dav.html#complex