Asp.net多语言网站 - 单独的目录与URL路由

时间:2012-03-28 07:35:28

标签: asp.net url routing seo multilingual

人们,我正在开发一个带有多语言内容的asp.net网站,SEO是一个非常重要的优先事项。

我设法让我的网站通过asp.net URL路由显示不同的URL以显示site.com/ar和site.com/en,具体取决于所选语言,这在根目录上的.apsx页面上工作正常。但是,这在子目录中的页面中不起作用,例如site.com/en/Account/Login.aspx,我花了几天时间尝试使我的URL路由与我的子目录一起工作但我无法使用它子目录。

因此,从简单的角度来看,最好在我的根目录中使用不同的物理目录/ ar和/ en,每种语言都有不同的内容页面。这也是首选,因为/ ar页面的布局完全水平翻转,因为ar =阿拉伯语=从右到左的语言。

请分享您对此方法的优点缺点的看法。

3 个答案:

答案 0 :(得分:1)

基于URL的方法即使在子目录上也应该正常工作。因为您提到“子目录”而不是“控制器/操作”,我假设您使用ASP.NET WebForms而不是MVC实现了应用程序。

如果是这样,您可以在Application_BeginRequest

中重写您的请求
   public void Application_BeginRequest( object sender, EventArgs e )
   {
        HttpApplication app = (HttpApplication)sender;
        HttpContext ctx = app.Context;

        string PathAndQuery = ctx.Request.Url.PathAndQuery;

        // parse the PathAndQuery and if it is of the form
        // en/Subdir1/Subdir2/resource.aspx
        // split it into [en] (virtual part) and [Subdir1/Subdir2/resource.aspx] (physical part)

        string VirtualPart  = GetVirtualPart( PathAndQuery );
        string PhysicalPart = GetPhysicalPart( PathAndQuery );

        ctx.RewritePath( PhysicalPart );
   }

通过这种方法,您可以在文件系统中拥有自己的物理结构,并将en\Subdir1\Subdir2\resource.aspx格式的请求正确路由到Subdir1\Subdir2\resource.aspx

虽然示例显示了手动重写,但如果符合您的需要,您可以使用任何现有的重写技术。

这只是为了让你入门。但是,如果您在实施网址重写时遇到任何具体问题,我认为您必须提出其他具体问题,以便人们可以帮助您解决具体问题。如果您只是说我已经花了好几天而且它不起作用那么就无法用您的具体方法来帮助您。

答案 1 :(得分:0)

我认为使用路线的网络表格使用以下内容非常简单:

routes.MapPageRoute("", "Category/{action}/{categoryName}", "~/categoriespage.aspx")

还发现这篇文章可能会有所帮助,具体取决于您如何使用文化信息。 http://www.codeproject.com/Articles/72478/Web-Site-Globalization-With-ASP-NET-Routing

答案 2 :(得分:0)

就个人而言,我会避开物理目录并采用路由方法。将来添加语言要容易得多,如果您发现需要支持文化(en-US,en-CA,en-GB等),您可以轻松引入默认文化( ie 。如果没有en-GB资源,则默认为en-US)而不是创建资产的第二个物理副本。我曾在大型网站上工作,这些网站在本地化目录下有重复文件。当你添加语言时,它会立即开始受到伤害。

对于路径和子目录的问题,您可以尝试在路径中放置一个常量,因为这样可以使url更容易匹配模式。我在这里使用'X':

routes.Add("LocalisedRoute", new Route
    (
         "{lang}/X/{path}"
         , new IRouteHandler()
    ));

现在这两条路径应匹配:

  • site.com/en/X/Account/Login.aspx
  • site.com/en/X/Default.aspx

如果采用@TonyStark链接中概述的方法,那可能没有必要,但总的来说,我发现在过去摆弄路线时添加一个常量非常有用。

编辑:请注意,Google's recommendation是为每种语言使用子域,例如。 en-US.site.com。