質問

アフィリエイト文字列が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} は、1つのセグメントだけでなくパス全体に一致します。ただし、パス全体に一致するため、最後にアフィリエイトIDに一致することはできません。ルートはすべてのリクエストに一致します。ルート制約を追加して、 url の末尾にアフィリエイトIDがあることを確認することで、これを回避できます。

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

アクションは、 url パラメータ自体からアフィリエイトIDを解析する必要があります。 URL構造を変更するオプションがある場合、パスの先頭にあるIDに一致する可能性があります。

<*>

他のヒント

これを実行していた場合、クエリ文字列の値の1つにします。

例:

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

問題は、アフィリエイトIDがオプションであることです。パスに配置すると、アフィリエイトIDが存在するかどうかに基づいてパスの構造が変更されるため、すべてのルートを2回実行する必要があります(アフィリエイトIDを使用して1回、なしで1回)。 。

定義されているルートが1つだけの場合、このキャッチオールルートのみを使用できます。ただし、複数のルートがある場合は、その {affiliateExternalId} パラメーターをすべてのルートに追加する必要があります(何かが足りない場合を除く)。

2番目のロバートハーベイ提案

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top