在IIS重写规则

时间:2015-11-26 15:44:39

标签: asp.net iis url-rewriting url-rewrite-module

我的方案如下:场地可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,因此我的网址现在就像:

  1. /venues/beaches/boats/themeparks (这将显示所有场地,即海滩和船只和主题公园)
  2. /venues/beaches/boats
  3. /venues等。
  4. 因此,不同场地类型(海滩,船只,主题公园等)的数量是动态和可选的。如何设置我的重写规则,category查询字符串参数包含所有不同的地点类型,或者最好{i}}参数添加多次,如果没有提供venuetype category将只为空/空?

    对于网址:category

    我得到了这个重写的网址:/venues/beaches/boats/themeparks

    对于网址:search.aspx?category=beaches&category=boats&category=themeparks

    我得到了这个重写的网址:/venues(或者也可以:search.aspx?category=

    我现在只有这个:

    search.aspx

    更新

    我选择了以下@Arindam Nayak的建议。

    我安装了https://www.nuget.org/packages/Microsoft.AspNet.FriendlyUrls.Core/并在<rule name="venue types"> <match url="^venues/([a-zA-Z0-9-+']+)$"/> <action type="Rewrite" url="search.aspx?category={R:1}"/> </rule> 文件夹中手动创建了RouteConfig.vb文件。我补充说(作为测试):

    App_Start

    Public NotInheritable Class RouteConfig Private Sub New() End Sub Public Shared Sub RegisterRoutes(routes As RouteCollection) Dim settings = New FriendlyUrlSettings() settings.AutoRedirectMode = RedirectMode.Permanent routes.EnableFriendlyUrls(settings) routes.MapPageRoute("", "test", "~/contact.aspx") End Sub End Class 我添加了:

    global.aspx.vb

    当我转到Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) RouteConfig.RegisterRoutes(RouteTable.Routes) End Sub 时,它现在可以正确地将我重定向到contact.aspx。 (请注意:网址重写 - 因此www.example.com/testweb.config文件中的规则优先于rewriteRules.config!)

    我几乎就在那里,所以这个RouteConfig.vb正确地重定向到文件www.example.com/test 但是这个contact.aspx会引发404错误:

    enter image description here

    更新2

    我添加了日志记录到www.example.com/test/boats/outside/more/fields/are/here

    routeConfig.vb

    这些行都被执行了。现在发生了一些奇怪的事情: routeConfig.vb似乎只执行一次。所以:

    1. 我构建了我的应用。
    2. 我转到 GlobalFunctions.Log("1") Dim settings = New FriendlyUrlSettings() GlobalFunctions.Log("2") settings.AutoRedirectMode = RedirectMode.Permanent GlobalFunctions.Log("3") routes.EnableFriendlyUrls(settings) GlobalFunctions.Log("4") routes.MapPageRoute("", "test", "~/contact.aspx") GlobalFunctions.Log("5") 网址
    3. 记录行,我到达/test页面
    4. 我刷新/测试页面,没有记录行
    5. 我也尝试过:

      1. 我构建了我的应用。
      2. 我转到contact.aspx网址
      3. 记录行
      4. 我收到上述404错误
      5. 我刷新页面,不再记录任何内容
      6. 所以看来routeConfig只被击中一次(在applicationstart?)然后再也没有击中。对于请求/test/boats/outside/more/fields/are/here,它到达routeConfig.vb文件,但由于某种原因未显示/test/boats/outside/more/fields/are/here ...

        更新3

        我发现当我明确定义路由时,它确实有效,如下:

        contact.aspx

        现在网址routes.MapPageRoute("", "test", "~/contact.aspx") routes.MapPageRoute("", "test/123", "~/contact.aspx") /test有效,但这根本不是动态的,因为我只想在/test/123上匹配,然后获取FriendlyUrlSegments。

        我无法在线发布代码,因此如果有帮助,请点击我的解决方案资源管理器: enter image description here

        我该怎么办?

1 个答案:

答案 0 :(得分:1)

要拥有这种SEO友好的URL,您需要安装“Microsoft.AspNet.FriendlyUrls”nuget包。

打开包管理器控制台 - Help。然后输入以下内容 -

Install-Package Microsoft.AspNet.FriendlyUrls

然后它会在RouteConfig.cs中自动添加以下内容。

public static class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      var settings = new FriendlyUrlSettings();
      settings.AutoRedirectMode = RedirectMode.Permanent;
      routes.EnableFriendlyUrls(settings); 
    }
}

对于您的情况,您需要将以下内容添加到RouteConfig.cs

routes.MapPageRoute("", "venues", "~/venues.aspx");

因此,当您点击网址http://www.example.com/venues/beaches/boats/themeparkshttp://www.example.com/venues/beaches时,它会点击venues.aspx。在venues.aspx.cspage_load事件中,您需要拥有以下代码。

IList<String> str = Request.GetFriendlyUrlSegments();

对于case-1,str将为['beaches','boats','themeparks'],而对于case-2,则为['beaches']

有关详情,请参阅my blog或类似的答案 - Reroute query string using friendlyUrl

请告诉我,如果您遇到任何问题,或者您的问题仍未得到解决。