我正在使用.NET Framework 3.5 SP1在ASP.NET下为客户网站构建产品目录。每个产品都有一个部件号和一个OEM部件号(全部都是唯一的)。
出于搜索引擎优化的目的,我希望OEM部件号尽可能接近实际的域名。
如何构建允许我这样做的路由规则:
http://www.myDomain.com/oemPartNumber
http://www.myDomain.com/myPartNumber
虽然仍然可以这样做:
http://www.myDomain.com/welcome
http://www.myDomain.com/products
http://www.myDomain.com/services
http://www.myDomain.com/contact
如果您有任何建议,我也很乐意听到您的其他SEO建议(我们主要对Google感兴趣)。
感谢。
重要提示:这不是MVC网站,因此我没有控制器。
答案 0 :(得分:1)
如果部件号有特定格式,您可以在路线上使用正则表达式约束:
routes.MapRoute(
"Part number",
"{partNumber}",
new { controller = "Part", action = "Display" },
new
{
partNumber = @"\d+" // part number must be numeric
}
);
像“welcome”这样的文字与正则表达式不匹配,所以会忽略这条路线。
答案 1 :(得分:1)
您应该可以指定http://www.mydomain.com/oempartnumber/oem和http://www.mydomain.com/mypartnumber/pn之类的内容。网址中必须存在允许您选择要使用的控制器的内容,并且还允许您区分部件号和oem部件号(除非这些部件号彼此独特。如果永远不会重叠在oem和pn之间你可以有http://www.mydomain.com/ {partnumber} / pn。
RouteTable.Routes.Add(new Route
{
Url = "[query]/pn",
Defaults = new { controller="PartNumber", action = "Details" },
RouteHandler = typeof(MvcRouteHanderl)
});
你可以使用这样的路线来诡计:
routes.MapRoute(
"Part number",
"{partNumber}",
new { controller = "Part", action = "Display" },
new
{
partNumber = @"\d+" // part number must be numeric
}
);
但问题是,实际上不是零件编号的OEM零件编号(例如“ave-345”)不匹配!
更新:在阅读中我注意到你说“这不是MVC网站,所以我没有控制器!”......哦!这会改变一切。在这种情况下,您可以检查目录是否存在您传入http://www.mydomain.com/1234的位置,如果不存在,则可以测试产品编号。这必须在HttpModule中完成,因此您可以在页面执行之前捕获它。然后在服务器端,您可以将页面指向http://www.domain.com/productdetails?pid=1234。
看看这里了解:http://www.15seconds.com/Issue/020417.htm
为此,您将拥有一个继承自IHttpModule的类。然后,您可以指定Init方法
public void Init(HttpApplication application)
{
//let's register our event handler
application.PostResolveRequestCache +=
(new EventHandler(this.Application_OnAfterProcess));
}
然后指向您的Applicaton_OnAfterProcess方法:
private void Application_OnAfterProcess(object source,EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
...
在此处,您可以指定一些有关您要查找的内容的规则。
我通常会按照
的方式做点什么if (!System.IO.File.Exists(application.Request.PhysicalPath)) //doesn't exist
{
//you test for your product ID here
...
//if you find it stuff it into a ProductID variable for later...
隔离产品ID后,您可以重写URL(服务器端)并将用户定向到正确的productDetails.aspx页面。
context.RewritePath("~/products/productDetails.aspx?ProductID=" + ProductID.ToString());
因此,当用户和Google看到http://www.mydomain.com/1234时,您的应用会看到http://www.mydomain.com/products/productdetails.aspx?productid=1234,您可以像往常一样对其进行编码。
我希望这就是你要找的东西!
答案 2 :(得分:1)
我看到你已经接受了答案,但让我发布一个更简单的新答案。
这不是MVC网站,所以我没有 控制器。
如果您使用网络表单,这适合您:Using Routing with Web Forms
基本上,您必须创建自己的IRouteHandler
并设置您的路线。然后,您可以使用它将任意数量的URL映射到Web窗体。这使您免于旧的URL重写方法和这些肮脏的技巧。 (该博客条目上的下载链接不再起作用,但这非常简单。无论如何,如果你需要一个有效的例子,我可以为你提供一个。)