문제

제휴 문자열이 URL에있을 때 추적 할 수있는 포획 경로를 만들려고합니다. 제휴 코드는 다음으로 표시됩니다 x 그 뒤에 int, URL의 끝에만 나타납니다 (쿼리 문자열 앞에).

아이디어는 제휴 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/

모든 것을 일치시키고 쿼리 문자열을 컨트롤러로 전달하려면 어떻게해야합니까? 이있다 * 내가 사용해야한다고 의심되는 운영자이지만 필요한 것을 할 수는 없습니다.

도움이 되었습니까?

해결책

{*url} 하나의 세그먼트가 아닌 전체 경로와 일치합니다. 그러나 전체 경로와 일치하기 때문에 마지막에 제휴 ID와 일치 할 수는 없습니다. 경로는 모든 요청과 일치합니다. 경로 제약 조건을 추가하여이를 확인할 수 있습니다. url 마지막에 제휴 ID가 있습니다.

routes.MapRoute(
    "WithAffiliate",
    "{*url}",
    new { controller="Home", action="LogCookieAndRedirect" },
    new { url = @"/x[0-9]+$" }
 );

그러면 귀하의 조치는 url 매개 변수 자체. URL 구조를 수정할 수있는 옵션이있는 경우 경로 시작 부분에있는 경우 ID와 일치 할 수 있습니다.

routes.MapRoute(
    "WithAffiliate",
    "x{affiliateExternalId}/{*url}",
    new { controller="Home", action="LogCookieAndRedirect" }
 );

다른 팁

내가 그것을하고 있다면, 나는 그것을 쿼리 문자열의 값 중 하나로 만들 것입니다.

예시:

http//www.domain.com/path/to/something?affiliate=X32&query=string

문제는 제휴사 ID입니다 선택 과목. 경로에 넣으면 제휴 ID가 있는지 여부에 따라 경로의 구조를 변경하므로 모든 경로를 두 번 수행해야합니다 (한 번은 제휴 ID를 사용하여 한 번). .

하나의 경로가 정의 된 경우에만이 포괄적 인 경로를 가질 수 있습니다. 하지만 여러 경로가 있다면 추가해야합니다. {affiliateExternalId} 모든 경로에 대한 매개 변수 (내가 뭔가를 놓치지 않는 한).

나는 두 번째 로버트 하비'에스 제안.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top