Si se quieren procesar páginas JSP y ASP.NET en un mismo servidor no queda más remedio que tener instalados Tomcat e IIS simultáneamente. Si además queremos que las páginas se sirvan por el mismo puerto, que generalmente suele ser el 80, pues ya tenemos un problema. Existen conectores ISAPI que permiten reenviar las peticiones JSP del IIS al Tomcat, como hace el Plesk 9 para Windows, pero siempre los he encontrado complejos de configurar. Sin embargo, en la última instalación de Windows Server 2008 R2 que hemos realizado, hemos encontrado un nuevo conector que simplifica enormemente el trabajo, permitiendo realizarlo en dos pasos.

Partiremos de una instalación funcional de IIS 7.5 en el puerto web estándar, y de Tomcat 7.0.25 en el puerto 8080 con AJP en el puerto 8009. Si no sabes cómo llegar a este punto, mal empezamos… :P

Supondremos que la web JSP que queremos alojar está en

C:\inetpub\wwwroot\miwebaspxjsp.com\partejsp. En tal caso, lo primero que haremos será hacer que Tomcat conozca dicho código, creando un fichero XML en %CATALINA_HOME%\conf\Catalina\localhost, con nombre partejsp.xml, y con el siguiente contenido:

<Context
  displayName="partejsp"
  docBase="C:\inetpub\wwwroot\miwebaspxjsp.com\partejsp"
  path="/partejsp"
  reloadable="true"
/>

Ahora vamos a la URL http://miwebaspxjsp.com:8080/partejsp, y deberíamos ver el contenido servido directamente por Tomcat correctamente. Si no es así, toca revisar las rutas y reiniciar el servicio Tomcat.

Sin embargo, si vamos a la URL http://miwebaspxjsp.com/partejsp, obtendremos un precioso error 404.3, ya que IIS no sabe cómo interpretar el script y además no nos permite descargarlo al no conocer el tipo MIME del fichero.

Ahora la parte mágica: Descarga el proyecto IIS to Tomcat Connector de Bilal. En él encontrarás un instalador que a partir de unos datos mínimos de configuración se encargará de registrarse en el IIS, pudiendo limitarse a los sitios que se le indique, de forma que no haya que configurar nada más que el nuevo documento por defecto index.jsp.

Tras la instalación, prueba de nuevo la URL http://miwebaspxjsp.com/partejsp, y si todo ha ido correctamente, ya se debería mostrar exactamente lo mismo que accediendo a http://miwebaspxjsp.com:8080/partejsp.

Como limitación, indicar que con este sistema siempre se cargaría la web JSP como subdirectorio, en la URL http://www.miwebaspjsp.com/partejsp/. Seguramente se podrá solucionar, pero como no lo hemos necesitado, no he investigado más.

Actualización: Cómo hacerlo funcionar en el raíz y con servlets

Para hacerlo funcionar en el raíz del dominio, podemos utilizar el módulo URL Rewrite de IIS, similar al mod_rewrite de Apache, de forma que redirijamos todas las peticiones a una subcarpeta, y así no tenemos que pelear tanto con la configuración. También debemos preservar la ruta de la cookie, para evitar problemas con las sesiones, con una segunda regla. Quedaría en web.config más o menos así:

        <rewrite>
            <rules>
                <rule name="Reescribimos a subcarpeta" enabled="true">
                    <match url="^(.*)" />
                    <action type="Rewrite" url="carpetaconjsp/{R:1}" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Reescribimos la ruta de la cookie de sesión">
                    <match serverVariable="RESPONSE_Set_Cookie" pattern="^(.*); Path=/carpetaconjsp(.*)" />
                    <action type="Rewrite" value="{R:1}; Path={R:2}" />
                </rule>
            </outboundRules>
        </rewrite>

Igualmente, si utilizamos servlets, habrá que modificar el manejador por defecto, para que IIS no salte con un 404 si no se llama a algo que no sea un JSP, quedando el siguiente código en web.config:

        <handlers>
            <add name="Boncode" path="*" verb="*" type="BonCodeIIS.BonCodeCallHandler,BonCodeIIS,Version=1.0.0.0,Culture=neutral,PublicKeyToken=ad590a40d40745cf" resourceType="Unspecified" preCondition="integratedMode" />
        </handlers>