Ayer me surgió un problema mientras estaba preparando la entra anterior, "Hacer ping a buscadores en php". Resulta que al intentar previsualizar un post, siempre me mostraba el error "Service Temporarily Unavailable", y no me actualizaba el post. Al principio sospeche que podía ser problema del plugin que utilizo para resaltar el código php, pero fijándome en el titulo de la ventana, y viendo que daba un código de error 503, llegue a la conclusión que seria problema con el servidor, en este caso dreamhost. Así que lo mejor en estos casos es, aprovechando el acceso ssh, revisar los ficheros de logs del dominio, para ver si muestra algún tipo de error y si nos da muestra más información. Tenemos que editar el fichero /logs/dominio/http/error.log [code lang="bash"] $ tail error.log [/code] Con esto vemos las últimas lineas del fichero de error. En mi caso me he encontrado con esto: [code lang="bash"] [Tue Oct 06 14:00:31 2009] [error] [client XXX.XX.XX.XX] mod_security: Access denied with code 503. Pattern match "(****|****|****|****|****|****|****|************|********|****|****|****|****|****|****|****|****|****|****|****|****|****|****)\\\\(.*\\\\)\\\\;" at **** [severity "********"] [hostname "*******"] [uri "/wp-admin/post.php"] [unique_id "*****************************"] [/code] En resumen, lo que indica que es mod_security comprueba si se ha introducido alguna función no permitida (en mi caso fue fopen() y fwrite()). Si es así, detiene la ejecución del script y muestra el error 503. Es un sistema de seguridad de los servidores de Dreamhost que se activa desde el panel de control del dominio: [caption id="attachment_457" align="alignnone" width="150" caption="Dreamhost - Mod Security"]Dreamhost - Mod Security[/caption] Para evitar este error, podemos seguir los pasos que nos indica en el wiki de dreamhost sobre mod_security. Básicamente tenemos dos opciones:

  • La primera es desactivar el mod_security solo para nuestra ip, añadiendo el siguiente codigo al .htaccess: [code lang="bash"] <ifmodule mod_security.c> SetEnvIfNoCase Remote_Addr ^XXX\.XXX\.XXX\.XXX$ MODSEC_ENABLE=Off </ifmodule> [/code] donde XXX.XXX.XXX.XXX es nuestra ip. Esto funciona si tenemos ip fija, o estamos detrás de un router y nuestra ip es dinámica, pero no suele cambiar.
  • Pero si tenemos ip dinámica, y el problema ocurre con un fichero puntual (por ejemplo al postear en un blog), podemos desactivar el mod-security para ese fichero en concreto, por ejemplo: [code lang="bash"] <ifmodule mod_security.c> SecFilterSelective REQUEST_URI "^/wp-admin/post\.php.*$" "allow,pass" </ifmodule> [/code]

Con uno de estos sencillos pasos, no debería darnos mas problemas el insertar código php, utilizando cualquier función, con el mod_security activado.