如何将特定子域请求重新路由到其他ASP.NET MVC控制器?

时间:2013-09-03 18:07:05

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我有一个ASP.NET MVC 4 Web应用程序。它有一个默认主页,可处理对http://www.mydomain.com以及http://mydomain.com的所有请求。我还有一个可以通过www.mydomain.com/Foo/Hello/访问的MVC区域设置(其中“Foo”是区域的名称,“Hello”是该区域的控制器)。

如果有人立即向foo.mydomain.com发出请求,它会将它们路由到默认的主页控制器。我希望所有对foo子域根的请求(例如,没有指定特定区域/控制器)自动重新路由到/foo/hello/控制器。

此外,我希望通过www子域向“Foo”区域的任何请求被重定向到“foo”子域。即。我希望www.mydomain.com/Foo/Goodbye的所有请求都自动重定向到foo.mydomain.com/Foo/Goodbye

我当然看过很多地方和lots of other samples / questions,但似乎都没有解决我的确切问题。

我不确定我是否应该解决路线,路线限制,路线处理程序等问题。

此外:此应用程序托管在 Windows Azure云服务 上,因此我无法完全控制IIS设置。

2 个答案:

答案 0 :(得分:1)

  

在您的Web服务器中,您站点的应用程序池必须具有集成管道模式,如下所示:

enter image description here

  

或者您可以通过以下应用程序池的基本设置找到它。

enter image description here

  

然后我在我的示例MVC应用程序中添加了HttpModule

<强> HTTP模块

public class MyModule1 : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += context_BeginRequest;
    }

    public void Dispose() { }

    void context_BeginRequest(object sender, EventArgs e)
    {
        if (!System.Web.HttpContext
                       .Current
                       .Request
                       .Url
                       .Authority
                       .Contains("foo.mydomain.com"))
        {
            string URL = 
                (System.Web.HttpContext.Current.Request.Url.Scheme + "://" +
                "foo.mydomain.com" + 
                HttpContext.Current.Request.Url.AbsolutePath + 
                HttpContext.Current.Request.Url.Query);
            System.Web.HttpContext.Current.Response.Clear();
            System.Web.HttpContext.Current.Response.StatusCode = 301;
            System.Web.HttpContext.Current.Response.Status 
                                                    = "301 Moved Permanently";
            System.Web.HttpContext.Current.Response.RedirectLocation = URL;
            System.Web.HttpContext.Current.Response.End();
        }
    }
}
  

然后我为我的HttpModule添加了一些代码n Web.config

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
  <modules>
    <add name="MyModule1" type="rewrite.MyModule1" />
  </modules>
  <handlers>
    <remove name="UrlRoutingHandler" />
  </handlers>
</system.webServer>


<system.web>
    <httpModules>
      <add name="MyModule1" type="rewrite.MyModule1" />
    </httpModules>
</system.web>
  

然后在主机文件中添加了以下代码。

127.0.0.1  foo.mydomain.com
  

然后我为我的网站添加了Bindings

enter image description here

答案 1 :(得分:0)

您可以将URL Rewrite模块用于IIS7 +以实现您所描述的内容。文档在这里:URL Rewrite Module Configuration Reference

简化的例子是:

  1. 重写URL以便foo.mydomain.com访问/ foo / hello(所以没有 重定向)
  2. 将网址www.mydomain.com/foo重定向到foo.mydomain.com/foo
  3. 添加您的web.config,system.webServer节点rewrite部分:

    ...
        <rewrite>
          <rules>
            <rule name="Redirect mydomain.com/foo to foo.mydomain.com/foo" patternSyntax="Wildcard" stopProcessing="true">
              <match url="foo" negate="false" />
              <conditions>
                <add input="{HTTP_HOST}" pattern="mydomain.com" />
              </conditions>
              <action type="Redirect" url="http://foo.mydomain.com/{R:0}" redirectType="Temporary" />
            </rule>
            <rule name="Rewrite foo.mydomain.com to access /foo/hello" patternSyntax="Wildcard" stopProcessing="true">
              <match url="" />
              <conditions>
                <add input="{HTTP_HOST}" pattern="foo.mydomain.com" />
              </conditions>
              <action type="Rewrite" url="/foo/hello" />
            </rule>
          </rules>
      </rewrite>
    </system.webServer>
    

    您还可以使用GUI在IIS管理器中编辑/查看这些规则。单击您的网站,然后转到IIS部分/ URL重写模块。 Bellow你可以在GUI中看到第一条规则。

    URL Rewrite rule in IIS Manager