【发布时间】:2015-04-16 05:39:47
【问题描述】:
我在 IIS 中有网站的下一个配置:
-
http://main.domain.com网站(ASP.NET MVC 5 app,网站绑定到指定主机,80端口) - 默认网站绑定到 :80 并启用 ARR/URL 重写模块
在 DNS 设置中指定了通配符绑定 *.domain.com。
期望的行为是将http://main.domain.com 作为入口点和一组动态用户子域,例如http://user1.domain.com、http://user2.domain.com 等。
现在这种行为是使用http://main.domain.com/user/user1之类的链接来模拟的
我已经为main.domain.com 设置了 URL 重写规则,如下所示:
<rule name="user-redirection" enabled="true" stopProcessing="true">
<match url="^.*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTP_HOST}" pattern="^([\w\d-]+)\.domain\.com$" />
</conditions>
<action type="Rewrite" url="http://main.domain.com/user/{C:1}/{R:0}" logRewrittenUrl="true" />
</rule>
这里一切正常 - 我可以看到 http://user1.domain.com 的工作方式与之前的 http://main.domain.com/user/user1 一样。
然后我尝试重新实现检查数据库中指定用户是否存在的逻辑。例如,当 user47 不存在时 - 打开http://main.domain.com/user/user47 链接会导致重定向到http://main.domain.com 入口点。
在代码端,它是通过将自定义过滤器属性添加到实现所需条件重定向的控制器操作来完成的。我有下一个代码:
public class UserController : Controller {
[CustomRedirectBehavior]
public ActionResult Index()
{
...
}
}
public class CustomRedirectBehaviorAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
...
if (redirectingCondition) {
filterContext.Result = new RedirectResult("http://main.domain.com");
}
}
}
这里....我在浏览器中收到循环重定向错误!可以肯定的是 - 我已经仔细检查了这种行为:
- 当我打开
http://main.domain.com/user/user47时,我被正确重定向到http://main.domain.com - 当我打开
http://user47.domain.com/时出现循环重定向错误。
然后为了调查问题,我将重定向回调修改为:
filterContext.Result = new RedirectResult("http://someotherdomain.com/some/other/path");
而且....我可以看到:
- 当我打开
http://main.domain.com/user/user47时,我被正确重定向到http://someotherdomain.com/some/other/path - 当我打开
http://user47.domain.com/时,我被重定向到http://user47.domain.com/some/other/path!!! (是的,这不是错字,我也仔细检查了这种行为)
所以。我需要一个关于如何解决这个问题的想法
【问题讨论】:
标签: asp.net-mvc iis url-rewriting arr