1

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

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

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

当然,我查看了很多其他 示例 /问题但似乎没有一个可以解决我的确切问题。

我不确定是否应该使用路由、路由约束、路由处理程序等来解决这个问题。

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

4

2 回答 2

1

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

在此处输入图像描述

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

在此处输入图像描述

然后我在我的示例 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

然后我为我的网站添加了绑定

在此处输入图像描述

于 2013-09-03T19:49:03.050 回答
0

您可以使用IIS7+ 的URL 重写模块来实现您所描述的。文档在这里:URL 重写模块配置参考

简化的例子是:

  1. 重写 URL 以便 foo.mydomain.com 访问 /foo/hello(所以没有重定向)
  2. 将 URL www.mydomain.com/foo 重定向到 foo.mydomain.com/foo

在您的 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 重写模块。您可以在下面看到 GUI 中的第一条规则。

IIS 管理器中的 URL 重写规则

于 2013-09-03T22:25:00.627 回答