Asp.net 处理IIS重写规则中可选URL参数的动态数量
我的场景如下:一个场馆可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,因此我的URL现在如下所示:Asp.net 处理IIS重写规则中可选URL参数的动态数量,asp.net,iis,url-rewriting,url-rewrite-module,Asp.net,Iis,Url Rewriting,Url Rewrite Module,我的场景如下:一个场馆可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,因此我的URL现在如下所示: /场馆/海滩/船只/主题公园 (这将显示所有海滩、船只和路标的场馆) /场馆/海滩/船只 /场馆等 因此,不同场馆类型(海滩、船只、人行道等)的数量既动态又可选。我如何设置重写规则,使categoryquerystring参数包含所有不同的场馆类型,或者最好是多次添加category参数,如果没有提供venuetype,则category将为空/空 所以对于URL:/场馆/海滩/船只
/场馆/海滩/船只/主题公园
(这将显示所有海滩、船只和路标的场馆)/场馆/海滩/船只
/场馆
等category
querystring参数包含所有不同的场馆类型,或者最好是多次添加category
参数,如果没有提供venuetype,则category
将为空/空
所以对于URL:/场馆/海滩/船只/主题公园
我会得到这个重写的URL:search.aspx?category=beats&category=boats&category=themeparks
网址:/ventions
我会得到这个重写的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>
在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/out/more/fields/are/here
URL/test/boats/out/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
,然后获得友好的URL片段
我无法将代码发布到网上,因此,如果有帮助,下面是我的解决方案资源管理器:
我能做什么?要获得这种SEO友好的URL,您需要安装“Microsoft.AspNet.friendlyURL”nuget软件包 打开包管理器控制台-。然后键入以下内容——
安装软件包Microsoft.AspNet.FriendlyURL
然后它会自动在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(“,”场馆“,“~/victions.aspx”)代码>
所以当你点击urlhttp://www.example.com/venues/beaches/boats/themeparks
或http://www.example.com/venues/beaches
,它将访问场馆.aspx
。在场馆.aspx.cs
,页面加载
事件中,您需要有以下代码
IList str=Request.GetFriendlyUrlSegments()代码>
对于案例1,str将是[“海滩”、“船只”、“码头”]
,而对于案例2,str将是[“海滩”]
有关更多信息,您可以参考或类似信息,请在此处回答-
如果您面临任何问题或您的问题仍未解决,请告诉我。您可以关注我的博客-,您可以使用请求。GetFriendlyURLSegments
,它将返回您的值数组,即场馆/X/Y/Z
的值将是[X,Y,Z]
,如果您需要更多详细信息,我可以将此作为答案发布。@ArindamNayak谢谢。是的,建议在SO上回答问题的方法是始终在SO上回答问题(外部站点可能会在将来被删除)。所以,是的,我希望你的答案在这里,适用于我的场景:)再次感谢!我已将我的建议作为答案发布。您是否可以尝试删除rewriteRules.config
,然后重试。我正在查看Visual Studio中的NuGet软件包管理器,查看Microsoft.AspNet.FriendlyUrls
,以及Microsoft.AspNet.FriendlyUrls.Core
,后者的描述似乎更符合我的需要。我需要哪一个?我正在使用VB.NET,但还没有RouteConfig文件…这有关系吗?我建议使用Microsoft.AspNet.FriendlyURL
,如果失败,那么使用第二个。你可以选择一个简单的基于MVC的项目(一个辅助项目),如果它在那里有效的话,那么你可以选择组件并使它与现有的一个一起工作。谢谢,我马上就到了,我想,最后一个错误似乎会把我甩了……看我更新的帖子。希望你能帮忙!(ps我为许多帖子更新道歉)@Flo,应该可以,你能在github或zip文件中共享你的项目吗?不幸的是,我不能这样做…我现在完全删除了rewriteRules.config,但错误仍然存在…我在我原来的帖子中添加了update2
部分…你还有其他调试建议吗?再次感谢!
public static class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Permanent;
routes.EnableFriendlyUrls(settings);
}
}