繁体   English   中英

处理 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将为空/空?

所以对于 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. 我转到/test URL
  3. 线路已记录,我到达contact.aspx页面
  4. 我刷新了 /test 页面,没有记录任何行

我也试过:

  1. 我构建我的应用程序。
  2. 我去/test/boats/outside/more/fields/are/here URL
  3. 记录了行
  4. 我收到上述 404 错误
  5. 我刷新页面,不再记录任何内容

所以似乎 routeConfig 只被击中一次(在 applicationstart?),然后再也没有击中。 对于请求/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。

我无法在线发布代码,所以如果有帮助,这是我的解决方案资源管理器: 在此处输入图片说明

我能做什么?

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

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

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']

有关更多信息,您可以在此处参考我的博客或类似的 SO 答案 - 使用friendlyUrl 重新路由查询字符串

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM