处理 IIS 重写规则中可选 URL 参数的动态数量

Handle dynamic number of optional URL parameters in IIS rewrite rules

我的场景如下:一个场地可以属于多个类别,用户也可以在多个类别类型上添加过滤器,所以我的 URL 现在是这样的:

  1. /venues/beaches/boats/themeparks (这将显示所有海滩、船只和主题公园的场所)
  2. /venues/beaches/boats
  3. /venues

所以不同场地类型(海滩、船、主题公园等)的数量是动态的和可选的。我如何设置我的重写规则,使 category 查询字符串参数包含所有不同的场地类型,或者最好多次添加 category 参数,如果没有提供场地类型,category 将只是 empty/null?

因此 URL:/venues/beaches/boats/themeparks

我会重写这个 URL:search.aspx?category=beaches&category=boats&category=themeparks

对于 URL:/venues

我会重写这个 URL:search.aspx?category=(或者也可以:search.aspx

我现在只有这个:

<rule name="venue types">
  <match url="^venues/([a-zA-Z0-9-+']+)$"/>
  <action type="Rewrite" url="search.aspx?category={R:1}"/>
</rule>

更新

我采纳了@Arindam Nayak 的以下建议。

我安装了 https://www.nuget.org/packages/Microsoft.AspNet.FriendlyUrls.Core/ 并在 App_Start 文件夹中手动创建了一个 RouteConfig.vb 文件。我添加(作为测试):

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

当我转到 www.example.com/test 时,它现在会正确地将我重定向到 contact.aspx。 (注意:URL 重写 - web.configrewriteRules.config 文件中的规则 - 优先于 RouteConfig.vb!)

我快到了,所以这个 www.example.com/test 正确重定向到文件 contact.aspx 但是这个 www.example.com/test/boats/outside/more/fields/are/here,抛出 404 错误:

更新 2

我将日志添加到 routeConfig.vb:

    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")

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

  1. 我构建我的应用程序。
  2. 我转到/testURL
  3. 行已记录,我到达 contact.aspx 页面
  4. 我刷新 /test 页面,没有记录任何行

我也试过:

  1. 我构建我的应用程序。
  2. 我转到/test/boats/outside/more/fields/are/hereURL
  3. 行已记录
  4. 我收到上述 404 错误
  5. 我刷新页面,没有任何记录了

所以 routeConfig 似乎只被命中一次(在应用程序启动时?),然后再也没有命中。对于请求 /test/boats/outside/more/fields/are/here,它到达 routeConfig.vb 文件,但由于某种原因没有显示 contact.aspx...

更新 3

我发现当我显式定义路由时,它确实有效,如下所示:

routes.MapPageRoute("", "test", "~/contact.aspx")
routes.MapPageRoute("", "test/123", "~/contact.aspx")

所以现在 URL /test/test/123 可以工作,但这根本不是动态的,因为我只想匹配 /test 然后获取 FriendlyUrlSegments。

我无法post在线获取代码,所以如果有帮助,这是我的解决方案资源管理器:

我能做什么?

要有这样的 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");

所以当你点击 url http://www.example.com/venues/beaches/boats/themeparkshttp://www.example.com/venues/beaches 时,它会点击 venues.aspx。在 venues.aspx.cspage_load 事件中你需要有以下代码。

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

对于案例 1,str 将是 ['beaches','boats','themeparks'],对于案例 2,它将是 ['beaches'].

更多信息可以参考my blog or similar SO answer here -

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