lunes, 12 de octubre de 2009

PHP con IIS o Apache

Problemas con PHP en IIS / Apache y mod_rewrite

Como desarrollador con más de 15 años de experiencia he obtenido información de la web en cantidades industriales, ya sea topándome con problemas menores (comodidad) o mayúsculos e indescifrables. Haciendo un poco de memoria recuerdo que hace 15 años atrás le pagábamos a soporte de desarrollo Microsoft unos 250 pesos actuales por cada página faxeada con soluciones de su base de conocimiento. Por suerte hoy está todo casi al alcance de la mano y, como retribución a todos los que me ayudaron en su momento sin saberlo, comienzo a escribir artículos con inconvenientes que tuve y soluciones que encontré para compartirlas con los demás.

Hace poco más de un año retomé el desarrollo en PHP, el cual había dejado de lado por un tiempo largo ya que principalmente desarrollo con herramientas de Microsoft (.Net 1.1, 2.0 y 3.5). Instalé en mi máquina de desarrollo la versión 5.2.4 de php sobre el ya existente IIS. Hasta ahí todo funcionó perfectamente pero un trabajo actual me exigía el mod_rewrite para las famosas friendly url's. Intenté agregar algunas extensiones que ya existen y que hacen lo mismo, pero al tener que modificar ciertos comportamientos y tratándose de un sitio existente opté por instalar Apache tal cual está en el servidor de producción.

La versión de Apache instalada es la 2.2.14 y desde el principio comencé a tener inconvenientes. Primero debía hacer funcionar el php, y a pesar de las distintas combinaciones de modificar el httpd.conf por mi cuenta no logré hacerlo funcionar. Lo que más encontraba en los blogs y foros era agregar lo siguiente:

ScriptAlias /php/ "C:\Directorio\PHP"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"

Si bien todos indican que debe funcionar no lo hace, hay temas de permisos implícitos que se deben modificar y ninguna sugerencia funcionó. En teoría el php.exe debería ejecutarse en un subdirectorio de la raíz del servidor Apache, o bien modificar permisos. Opté por abrir la instalación de PHP, ejecutar la opción "cambiar configuración" y dejar que se encargue el instalador, el cual escribió lo siguiente:

#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
PHPIniDir "C:/Directorio/PHP/"
LoadModule php5_module "C:/Directorio/PHP/php5apache2_2.dll"
#END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL

Dejando activo de las anteriores líneas sólo el AddType:

AddType application/x-httpd-php .php

Evidentemente por defecto usa la librería mencionada y no el exe como Shell. Hasta ahí fue relativamente simple.

Luego debía configurar el .htaccess y la redirección. En principio un dato importante que me volvió loco al no estar tan acostumbrado a trabajar con php:

Hint: Los ftp por defecto ocultan los archivos que empiezan con . por seguridad, por ende jamás veía el archivo .htaccess para bajarlo hasta que no modifiqué la configuración. En FileZilla por ejemplo está en "Server -> Force showing hidden files"

Luego de agregar a la raíz del directorio donde estaba trabajando el .htaccess seguía sin funcionar porque no había activado el rewrite, eso se logra sacando el comentario a la línea

#LoadModule rewrite_module modules/mod_rewrite.so

para transformarla en:

LoadModule rewrite_module modules/mod_rewrite.so

Al reiniciar el servidor, si no hubo errores, ya el módulo está cargado. Como eso no me permitía visualizar la friendly url tuve que hacer más modificaciones al httpd.conf, en la configuración Directory hay que activar el AllowOverride para que quede de la siguiente manera:

<directory>
Options FollowSymLinks
AllowOverride All
Order deny,allow
Deny from all
</directory>

De todas maneras no comenzó a funcionar hasta que en el Directory de la raíz (el anterior es el default) lo activé también. En eso no estoy seguro si ambos son realmente necesarios, porque no me funcionó hasta que el siguiente tag:

<Directory "C:/dir instalación/Apache2.2/htdocs">

No tuvo los mismos cambios que el anterior.

Luego de todas estas modificaciones por fin pude hacer funcionar adecuadamente las friendly url's.

Otro dato menor pero que ya me causó problemas, en un momento determinado el IIS dejó de funcionar y no levantaba, me di cuenta algo muy simple pero que trae complicaciones.

Hint: Al instalar Skype por defecto está configurado para usar los puertos 80 (estándar para http) y 443 (estándar SSL) como alternativa para conexiones entrantes. (Herramientas -> Opciones -> Conexión). Evidentemente lo abre al puerto aún no estando conectado y no se puede usar para el IIS, al modificarlo al 8080 en IIS comenzó a funcionar. Pero también hizo que no se instalara correctamente el Apache luego, por lo cual es mejor al menos hasta que se instale desmarcar esa casilla y usar un puerto alternativo en el textbox superior hasta que esté instalado el Apache.

Espero que les haya sido útil, y los más expertos de php me pueden corregir o sugerir lo que crean conveniente ya que, como aclaré, no estoy tan involucrado con las herramientas como php comparado a .Net.

No hay comentarios:

Publicar un comentario