我正在尝试创建一个catch-all路由来跟踪联盟字符串何时在URL中。关联代码由x
后跟int
标记,并且只会显示在网址的末尾(但在查询字符串之前)。
我的想法是,我将提取联盟会员ID,进行一些日志记录,然后在没有会员ID的情况下对同一请求执行301。
例如:
http://www.domain.com/x32
http://www.domain.com/x32/
http://www.domain.com/path/to/something/x32
http://www.domain.com/x32?query=string
http://www.domain.com/x32/?query=string
http://www.domain.com/path/to/something/x32?query=string
http://www.domain.com/path/to/something/x32/?query=string
我有这条路线
routes.Add(new Route("{url}/x{affiliateExternalId}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Home", action = "LogCookieAndRedirect" }
),
Constraints = new RouteValueDictionary(new { affiliateExternalId = @"\d{1,6}" })
});
仅匹配
http://www.domain.com/path/x32
http://www.domain.com/path/x32/
我需要做什么来匹配所有内容并将查询字符串传递给控制器?有一个*
运算符,我怀疑我应该使用它,但我不能让它做我需要的。
答案 0 :(得分:10)
{*url}
将匹配整个路径,而不仅仅是一个段。但是,由于它匹配整个路径,因此您无法在最后匹配联属会员ID。该路线将匹配每个请求。您可以通过添加路由约束来检查url
最后是否有联盟ID:
routes.MapRoute(
"WithAffiliate",
"{*url}",
new { controller="Home", action="LogCookieAndRedirect" },
new { url = @"/x[0-9]+$" }
);
然后,您的操作需要解析url
参数本身的联盟会员ID。如果您可以选择修改URL结构,则可以匹配ID,如果它位于路径的开头:
routes.MapRoute(
"WithAffiliate",
"x{affiliateExternalId}/{*url}",
new { controller="Home", action="LogCookieAndRedirect" }
);
答案 1 :(得分:0)
如果我这样做,我会把它作为查询字符串中的一个值。
示例:
http//www.domain.com/path/to/something?affiliate=X32&query=string
问题是会员ID是可选。如果你把它放在路径中,你将根据联盟会员身份是否存在来改变路径的结构,所以你必须做两次你的每一条路线(一次是联盟会员身份证,一次是没有)
答案 2 :(得分:0)
如果只定义了一条路线,则只能拥有此全能路线。但是如果你有多条路线,那么你将不得不将{affiliateExternalId}
参数添加到所有路线(除非我遗漏了一些东西)。
我第二次Robert Harvey的suggestion。