使用ARR的IIS反向代理与目录级别有问题

时间:2011-04-05 05:04:48

标签: asp.net asp.net-mvc iis url-rewriting reverse-proxy

我正在设置IIS 7.5来为我的网站的子目录执行反向代理。

这是web.config url-rewrite:

<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>

ip地址指向带有apache和django站点的联网linux盒子。

我想要什么
所有/ community / qa / *的请求都被重定向到指定的内部IP。

会发生什么
/ community / qa / - 给出404(在主IIS服务器上)
/ community / qa / questions / - 给出404(在主IIS服务器上)
- 但是 -
/ community / qa / questions / ask / Works !!!
/ community / qa / questions / unanswered / Works !!

所以它似乎适用于从起点开始的2个子目录的所有URL。

这对我来说似乎很奇怪,我无法理解。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:14)

我很确定在您的情况下问题出现在UrlRoutingModule设置中。如果您查看有序视图中的IIS模块设置,您会看到UrlRoutingModule放置得比Rewrite高,ApplicationRequestRouting模块放置。这意味着,如果您的应用程序中有ASP.NET MVC的Route-setup。此设置将影响服务器拦截它们并将它们转发到MVC-Route-Handler的请求,而不允许反向代理执行它的工作。例如,如果你有这样的通用路线设置:

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

在您的情况下,/community/qa//community/qa/questions/无效,因为它会与给定的Url模式匹配,并且会被解释为:

/ 社区 / qa / ---&gt; Controller =“社区”,操作=“的 QA

/ 社区 / qa / 问题 / ---&gt; Controller =“社区“,操作=” qa “,参数:Id =”问题

如果您没有此类控制器和操作,您将获得Http 404 Not Found。

/community/qa/questions/ask//community/qa/questions/unanswered/可以使用,因为它们与您系统中的任何UrlRouting模式都不匹配。

如此简单的解决方案是添加您的UrlRouting配置(当Web应用程序启动时)忽略您的网址规则:

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