处理 IIS 重写规则中可选 URL 参数的动态数量
Handle dynamic number of optional URL parameters in IIS rewrite rules
我的场景如下:一个场地可以属于多个类别,用户也可以在多个类别类型上添加过滤器,所以我的 URL 现在是这样的:
/venues/beaches/boats/themeparks
(这将显示所有海滩、船只和主题公园的场所)
/venues/beaches/boats
/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.config
或 rewriteRules.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 好像只执行一次。所以:
- 我构建我的应用程序。
- 我转到
/test
URL
- 行已记录,我到达
contact.aspx
页面
- 我刷新 /test 页面,没有记录任何行
我也试过:
- 我构建我的应用程序。
- 我转到
/test/boats/outside/more/fields/are/here
URL
- 行已记录
- 我收到上述 404 错误
- 我刷新页面,没有任何记录了
所以 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/themeparks
或 http://www.example.com/venues/beaches
时,它会点击 venues.aspx
。在 venues.aspx.cs
、page_load
事件中你需要有以下代码。
IList<String> str = Request.GetFriendlyUrlSegments();
对于案例 1,str 将是 ['beaches','boats','themeparks']
,对于案例 2,它将是 ['beaches']
.
更多信息可以参考my blog or similar SO answer here -
如果您遇到任何问题或问题仍未解决,请告诉我。
我的场景如下:一个场地可以属于多个类别,用户也可以在多个类别类型上添加过滤器,所以我的 URL 现在是这样的:
/venues/beaches/boats/themeparks
(这将显示所有海滩、船只和主题公园的场所)/venues/beaches/boats
/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.config
或 rewriteRules.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 好像只执行一次。所以:
- 我构建我的应用程序。
- 我转到
/test
URL - 行已记录,我到达
contact.aspx
页面 - 我刷新 /test 页面,没有记录任何行
我也试过:
- 我构建我的应用程序。
- 我转到
/test/boats/outside/more/fields/are/here
URL - 行已记录
- 我收到上述 404 错误
- 我刷新页面,没有任何记录了
所以 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/themeparks
或 http://www.example.com/venues/beaches
时,它会点击 venues.aspx
。在 venues.aspx.cs
、page_load
事件中你需要有以下代码。
IList<String> str = Request.GetFriendlyUrlSegments();
对于案例 1,str 将是 ['beaches','boats','themeparks']
,对于案例 2,它将是 ['beaches']
.
更多信息可以参考my blog or similar SO answer here -
如果您遇到任何问题或问题仍未解决,请告诉我。