C# 如何强制ASP.NET MVC站点使用单个域?

C# 如何强制ASP.NET MVC站点使用单个域?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc Routing,我目前有一个ASP.NETMVC站点,它有两个指向它的域(例如www.domainA.com和www.domainB.com)。我想将我的所有链接更改为使用www.domainA.com,即使访问了www.domainB.com 我所有的Url都是由内置的Url.Action和Html.ActionLink方法生成的 我很快就按照指示做了,但我不能完全让它工作 这是我的定制路线: public class MultipleDomainRoute : System.Web.Routing.Rout

我目前有一个ASP.NETMVC站点,它有两个指向它的域(例如www.domainA.com和www.domainB.com)。我想将我的所有链接更改为使用www.domainA.com,即使访问了www.domainB.com

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

我很快就按照指示做了,但我不能完全让它工作

这是我的定制路线

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);
    }
}
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
    );
}
这是我的RegisterRoutes方法:

class MyRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new MvcHandler(requestContext);
    }
}
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
    );
}
该路由正在运行(即没有破坏我的网站),但当我运行它时,我的URL只是附加到。。。例如,我得到“”


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

如果您使用的是IIS 7,那么最好在web服务器级别实现这一点

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

有两种方法可以实现这一点

1。通过IIS管理控制台

在IIS控制台中打开您的网站,选择URL重写,然后执行以下步骤:

  • 创建一个新规则并将匹配URL设置为通配符,然后输入模式作为辅助域
  • 添加一个条件,其中{HTTP_HOST}等于站点的辅助域
  • 将“操作类型”设置为重定向,并输入您希望重定向到的模式。"http://mysite.com{R:1}“在本例中,IP地址之后的所有内容都将映射到其等效域,因此mysite.net/mycontent将重定向到mysite.com/mycontent
  • 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>
    
    
    

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

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

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

    有两种方法可以实现这一点

    1。通过IIS管理控制台

    在IIS控制台中打开您的网站,选择URL重写,然后执行以下步骤:

  • 创建一个新规则并将匹配URL设置为通配符,然后输入模式作为辅助域
  • 添加一个条件,其中{HTTP_HOST}等于站点的辅助域
  • 将“操作类型”设置为重定向,并输入您希望重定向到的模式。"http://mysite.com{R:1}“在本例中,IP地址之后的所有内容都将映射到其等效域,因此mysite.net/mycontent将重定向到mysite.com/mycontent
  • 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>
    
    
    

    这种方法将确保您的子目录被映射,您的站点保持搜索引擎友好,并生成正确的响应代码。

    为什么不将domainB转发给domainA?我相信大多数注册商都允许您将一个域转发到另一个域。

    为什么不将domainB转发到domainA?我相信大多数注册商都允许您将一个域转发到另一个域。

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

    在IIS7中,正如其他人所提到的,使用内置的URL重写模块可以非常轻松地完成这项工作。看

    或者,在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>
    
    
    )

    IIS6中,只需为次要域添加一个新站点,并在“主目录”选项卡中将其设置为指向您的主要域:

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


    请注意,如果不使用这些顶级选项之一,您可能会遇到cookie问题。浏览器不喜欢将cookie从“www.a.com”发送到“www.b.com”。

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

    在IIS7中,正如其他人所提到的,使用内置的URL重写模块可以非常轻松地完成这项工作。看

    或者,在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>
    
    
    )

    IIS6中,只需为次要域添加一个新站点,并在“主目录”选项卡中将其设置为指向您的主要域:

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


    请注意,如果不使用这些顶级选项之一,您可能会遇到cookie问题。浏览器不喜欢将cookies从“www.a.com”发送到“www.b.com”。

    您需要在应用程序中这样做吗?IIS 7中的URL重写可以为您完成此操作。您需要在应用程序中执行此操作吗?在IIS 7中重写URL可以帮你完成这项工作。谢谢你的回复,我会调查的。不幸的是,我认为我无法访问主机上的IIS设置。@艾伦:您可以使用Web.config配置它。在本地IIS Express上尝试。然后在远程主机上部署。我将添加一个示例,用于在Web中配置。配置感谢您的回复,我将对此进行研究。不幸的是,我认为我无法访问主机上的IIS设置。@艾伦:您可以使用Web.config配置它。在本地IIS Express上尝试。然后在远程主机上部署。我将添加一个示例,用于在您的Web中配置。配置这会转发整个URL吗?例如,www.domainB.com/Home/Index变为www.domainA.com/Home