ASP.NET产品网站的路由规则

时间:2009-07-18 18:49:50

标签: c# .net asp.net .net-3.5 seo

我正在使用.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网站,因此我没有控制器。

3 个答案:

答案 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/oemhttp://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重写方法和这些肮脏的技巧。 (该博客条目上的下载链接不再起作用,但这非常简单。无论如何,如果你需要一个有效的例子,我可以为你提供一个。)