我正在设置 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 box。

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

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

因此,它似乎适用于距离起点深 2 个子目录的所有 URL。

这对我来说似乎很奇怪,我无法弄清楚。

在此先感谢您的帮助。

最佳答案

我很确定在你的情况下问题出在 UrlRoutingModule 设置中。如果您在 Ordered View 中查看 IIS Modules Setup,您将看到 UrlRoutingModule 的位置高于 RewriteApplicationRequestRouting 模块的位置。这意味着,如果您的应用程序中有 ASP.NET MVC 的路由设置。此设置将影响到达服务器的请求,拦截它们并将它们转发到 MVC-Route-Handlers,不允许反向代理完成它的工作。例如,如果您有这样的常见路线设置:

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 / ---> Controller =" 社区 ", Action=" qa "

/ 社区 / qa / 问题 / ---> Controller =" 社区 ", Action=" qa ", _ 参数 " 参数"

如果你没有这样的 Controller 和 Action ,你会得到 Http 404 Not Found。
/community/qa/questions/ask//community/qa/questions/unanswered/ 会起作用,因为它们与您系统中的任何 UrlRouting 模式都不匹配。

如此简单的解决方案是在您的 UrlRouting 配置中添加(当 Web 应用程序启动时)忽略您的 url 规则:
routes.IgnoreRoute("community/qa/{*pathInfo}");

关于asp.net - 使用 ARR 的 IIS 反向代理存在目录级别问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5547419/

10-12 23:38