C# 如何强制ASP.NET MVC站点使用单个域?
我目前有一个ASP.NETMVC站点,它有两个指向它的域(例如www.domainA.com和www.domainB.com)。我想将我的所有链接更改为使用www.domainA.com,即使访问了www.domainB.com 我所有的Url都是由内置的Url.Action和Html.ActionLink方法生成的 我很快就按照指示做了,但我不能完全让它工作 这是我的定制路线: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
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重写,然后执行以下步骤:
<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重写,然后执行以下步骤:
<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