[英]Handle dynamic number of optional URL parameters in IIS rewrite rules
我的场景如下:一个场地可以是多个类别的一部分,用户还可以在多个类别类型上添加过滤器,所以我的 URL 现在是这样的:
/venues/beaches/boats/themeparks
(这将显示所有海滩、船只和主题公园的场地)/venues/beaches/boats
/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.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
URLcontact.aspx
页面我也试过:
/test/boats/outside/more/fields/are/here
URL所以似乎 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/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']
。
有关更多信息,您可以在此处参考我的博客或类似的 SO 答案 - 使用friendlyUrl 重新路由查询字符串
如果您遇到任何问题或您的问题仍未解决,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.