2011-04-05 18 views
7

Estoy trabajando en la configuración de IIS 7.5 para realizar un proxy inverso para un subdirectorio de mi sitio.IIS Reverse Proxy utilizando ARR que tiene problemas con los niveles de directorio

Aquí es el web.config url-reescritura:

dirección
<clear /> 
<rule name="Reverse Proxy to Community" stopProcessing="true"> 
<match url="^community/qa/(.*)" /> 
<action type="Rewrite" url="http://xxx.xxx.xxx.xxx/{R:1}" logRewrittenUrl="true" /> 
</rule> 

la ip apunta a una máquina Linux en red con el sitio de Apache y una Django.

Lo que quiero
Toda solicitud de/comunidad/GC/* a ser redirigido a la IP interna especificada.

¿Qué ocurre
/comunidad/GC/- da 404 (en el servidor IIS principal)
/comunidad/qa/preguntas/- da 404 (en el servidor IIS principal)
- PERO -
/community/qa/questions/ask/Works !!!
/community/qa/questions/unanswered/Works !!

Parece que funciona para todas las URL que tienen 2 subdirectorios desde el punto de partida.

Esto me parece extraño, y no puedo entenderlo.

Gracias de antemano por cualquier ayuda.

Respuesta

14

Estoy bastante seguro de que en su caso el problema está en la configuración UrlRoutingModule. Si observa la configuración de los módulos IIS en la vista ordenada, verá que UrlRoutingModule se coloca más arriba que los módulos Rewrite y ApplicationRequestRouting. Eso significa que si tiene en su aplicación Route-setup para ASP.NET MVC. Esta configuración influirá en las solicitudes que lleguen al servidor que las intercepta y las reenviará a MVC-Route-Handlers, sin permitir que el proxy inverso haga su trabajo. Por ejemplo, si tiene configuración de ruta común como esto:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

En su caso /community/qa/ y /community/qa/questions/ no funcionaría porque sería partido determinado patrón de URL y habría sido interpretado como:

/comunidad/qa/---> controlador = "comunidad", Acción = "qa"

/comunidad/qa/preguntas/---> Controlador = "comunidad", Acción = "qa", de parámetros: id = "preguntas"

Si no tiene tales controladores y acciones obtendrá Http No encontrado.

/community/qa/questions/ask/ y /community/qa/questions/unanswered/ funcionarían, porque no coinciden con ningún patrón de UrlRouting en su sistema.

solución Tan simple es añadir en la configuración de UrlRouting (cuando se inicia la aplicación Web) ignorar la regla para su url:

routes.IgnoreRoute("community/qa/{*pathInfo}"); 
+0

Gracias! ¡El orden de reescritura de URL ayuda! –

Cuestiones relacionadas