我正在设置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。
这对我来说似乎很奇怪,我无法理解。
提前感谢您的帮助。
答案 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}");