如何强制将单个域用于ASP.NET MVC站点?

时间:2012-02-17 17:14:49

标签: c# asp.net .net asp.net-mvc asp.net-mvc-routing

我目前有一个ASP .NET MVC网站,有两个指向它的域名(例如www.domainA.com和www.domainB.com)。即使访问www.domainB.com,我也想更改所有链接以使用www.domainA.com。

我的所有网址都是由内置的Url.Action和Html.ActionLink方法生成的。

我按照previous question中的说明操作,但我无法使其正常工作。

这是我的自定义路线

public class MultipleDomainRoute : System.Web.Routing.Route
{
    public MultipleDomainRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler)
    {
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData path = new VirtualPathData(this, "http://www.domainA.com/" + values["controller"] + "/" + values["action"]);
        return path;
    }
}

这是我的自定义路由处理程序:

class MyRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new MvcHandler(requestContext);
    }
}

这是我的RegisterRoutes方法:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add(new MultipleDomainRoute("{controller}/{action}/{id}", new MyRouteHandler()));

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );
}

路线正在运行(即没有崩溃我的网站)但是当我运行它时,我的网址只会附加到http://localhost ...例如,我得到“http://localhost:56822/http:/www.domainA.com/Home/Index”。

有谁知道为什么这不起作用?

3 个答案:

答案 0 :(得分:5)

如果您使用的是IIS 7,最好在 Web服务器级别实现此功能。

这样,正确的状态代码将返回到HTTP标头中的浏览器,您的MVC应用程序可以处理自己的路由,而不必担心在大多数情况下是Web服务器工作的域和主机名。

有两种方法可以实现这个目标

<强> 1。通过IIS管理控制台

在IIS控制台中打开您的网站,然后选择URL Rewrite并按照以下步骤操作:

  1. 创建新规则并将匹配网址设置为通配符,并将模式输入为辅助域
  2. 添加 {HTTP_HOST} 等于网站的辅助域名的条件。
  3. 将“操作类型”设置为重定向,然后输入要重定向到的模式。在这种情况下,“http://mysite.com {R:1}”会将IP地址之后的所有内容映射到其域名,因此mysite.net/mycontent会重定向到mysite.com/mycontent
  4. <强> 2。在您的web.config

    <system.webServer>
    <rewrite>
     <rules>
     <rule name="Redirect to mydomain.com" stopProcessing="true">
     <match url=".*"/>
     <conditions>
     <add input="{HTTP_HOST}" pattern="^(www.)?mydomain.net"/>
     </conditions>
     <action type="Redirect" url="http://www.mydomain.com/{R:0}"/>
     </rule>
     </rules>
     </rewrite>
    </system.webServer>
    

    此方法将确保您的子目录已映射,并且您的网站仍然保持搜索引擎友好,并生成正确的响应代码。

答案 1 :(得分:0)

为什么不直接将域名转发到域名?我相信大多数注册商都会将您的域名转发给另一个域名。

答案 2 :(得分:0)

有几种方法可以做到这一点。

在IIS7中,正如其他人所提到的,您可以使用内置的URL Rewrite模块轻松完成此操作。参见

http://www.dotnetexpertguide.com/2011/08/iis-7-redirect-domaincom-to.html

或者,在web.config中添加类似的东西:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Redirect to WWW" stopProcessing="true">
          <match url=".*" />
          <conditions>
            <add input="{HTTP_HOST}" pattern="^yoursite.com$" />
          </conditions>
          <action type="Redirect" url="http://www.yoursite.com/{R:0}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

(来自this site

IIS6 中,只需为辅助域添加新网站,然后在“主目录”标签中将其设置为指向您的主域:

enter image description here

这将导致对第二个站点/辅助域的主机头的所有请求重定向到主域,包括原始站点中包含的任何路径和url参数。

请注意,如果您不使用其中一个顶级选项,则可能会遇到Cookie问题。浏览器不喜欢将“www.a.com”的cookie发送到“www.b.com”。