A raíz de una consulta que me llega de Jesús González a través de Google+, parece que instalar WordPress en una carpeta de Azure Websites no es tan común como pensaba, o, al menos, no está demasiado documentada. La idea es que http://www.miwebsite.com/blog pueda alojar una instancia de WordPress, mientras que en el raíz se mantenga una aplicación .Net. Este mismo escenario es el que tenía yo mismo, en la anterior versión de este blog.

Para ello, la primera opción sería seguir uno de los tutoriales que existen para ello, como este: http://blogs.msdn.com/b/kaushal/archive/2014/04/19/microsoft-azure-web-sites-deploying-wordpress-to-a-virtual-directory-within-the-azure-web-site.aspx. Este tutorial aborda una instalación desde cero de WordPress, realizando una instalación en local a través de la galería de aplicaciones de WebMatrix, y realizando la publicación a posteriori sobre el website.

Sin embargo, se puede dar el caso de que ya dispongamos de un WordPress funcionando y no queremos que WebMatrix le meta mano a nuestro código. Para ello necesitaremos realizar un par de pequeñas modificaciones manuales.

En este post anterior, en el que desglosaba un poco los detalles técnicos que he utilizado para implementar esta web, ya indicaba la problemática de compartir WordPress con MVC en Azure, y cómo lo había solucionado, pero parece que el tema tiene entidad suficiente como para dedicarle este pequeño post.

Configurando el Website

El problema principal de intentar hacer convivir una aplicación basada en .Net con otra basada en PHP, como es el caso, es saber discernir cuándo las peticiones que recibe el website las tiene que manejar un framework y cuándo el otro. En este caso, todo lo que se reciba a la url «/blog» y por debajo de ésta, lo tiene que renderizar el motor de PHP, y, en concreto, WordPress. Todas las demás, dejaremos que las maneje .Net.

Para ello, añadiremos la siguiente configuración al archivo web.config que se encuentra en el raíz del sitio web:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="blog" patternSyntax="Wildcard">
                <match url="blog/*" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="blog/index.php" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

De esta manera, utilizamos el módulo url_rewrite para enviar al motor de WordPress todas las peticiones que se reciban en la carpeta «/blog»

En segundo lugar, crearemos un segundo archivo web.config y lo alojaremos dentro de la carpeta «/blog», con el mismo contenido:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="wordpress" patternSyntax="Wildcard">
                    <match url="*"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                    </conditions>
                    <action type="Rewrite" url="index.php"/>
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Finalmente, también sería recomendable configurar el Website para indicarle que hay una aplicación virtual en la carpeta «/blog», tal y como se indica en el enlace que he dejado al inicio.

Dependiendo del tipo de aplicación .Net que tengamos instalada, tendremos que decirle a su vez que ignore todas las peticiones a «/blog». En mi caso,que utilizo MVC, esto se consigue añadiendo la siguiente configuración de enrutamiento:

routes.IgnoreRoute("blog/{*pathInfo}");

En general, el concepto es el mismo para hacer convivir cualquier aplicación .NET y PHP:

  • Redirigir las peticiones desde la aplicación raíz a la carpeta de la otra aplicación
  • Configurar la aplicación raíz para que ignore las peticiones a la aplicación anidada.

¡Espero que os sea de utilidad!