Asp.Net MVC Routing - how do I match the whole URL?
asp.net-mvc, asp.net-mvc-routing, routes, url-routing
Solution
`{*url}` will match the whole path rather than just one segment. However, since it matches the whole path, you can't then match the affiliate ID on the end. The route will match every request. You can get around that by adding a route constraint to check that `url` has an affiliate ID at the end:
routes.MapRoute(
"WithAffiliate",
"{*url}",
new { controller="Home", action="LogCookieAndRedirect" },
new { url = @"/x[0-9]+$" }
);
Your action will then need to parse the affiliate ID from the `url` parameter itself. If you have the option to modify the URL structure, it would be possible to match the ID if it were at the start of the path:
routes.MapRoute(
"WithAffiliate",
"x{affiliateExternalId}/{*url}",
new { controller="Home", action="LogCookieAndRedirect" }
);
Problem
I'm trying to create a catch-all route to track when an affiliate string is in the URL. An affilite code is marked by an `x` followed by an `int`, and will only appear at the end of a URL (but before the query string). The idea is that I will extract the affiliate ID, do some logging, then do a 301 to the same request without the affiliate ID. For example: ``` 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 ``` I have this route ``` 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}" }) }); ``` Which only matches ``` http://www.domain.com/path/x32 http://www.domain.com/path/x32/ ``` What do I need to do to match everything and pass the query string to the controller? There is a `*` operator that I suspect I should use, but I can't get it to do what I need.