4

HTTPRequestSitecore が適切なアイテムを見つけることができるが、要求された URL が Sitecore が形成するのとまったく同じように形成されない場合に、着信要求をリダイレクトするパイプラインの拡張機能を作成しています。これは、SEO の重複コンテンツの問題を防ぐためです。

URLの調べたい部分がLinkManager.GetItemUrl(context.item)結果に合致する部分です。私たちの場合、パスに言語が埋め込まれています。

www.mysite.com/en-gb/stuff/things

だからGetItemUrl戻ります/en-gb/stuff/things

Sitecore.Pipelines.HttpRequest.HttpRequestArgsオブジェクトでもオブジェクトでも、正しいメソッドが見つかりませんSystem.Web.HttpContext.Current.Request.Url

URL全体またはパスから言語の埋め込みを差し引いたものを取得できます。どのobject.methodが私に与えます/en-gb/stuff/thingsか?

4

2 に答える 2

5

正しく理解できたかどうかわかりませんが、探しているのは のようですSystem.Web.HttpContext.Current.Request.RawUrl。そうでない場合は、達成したいことをより詳細に説明してください。

于 2012-08-01T13:06:15.103 に答える
2

これは直接的な答えではありませんが、それでも、Sitecoreは、(私が思うに)達成しようとしていることを実行するときに、いくつかのトリックをミックスに投入するため、役立つ場合があります。

メモリから...

リンクマネージャーがLanguageEmbedding'always'または'asNeeded'で設定されている場合(そしてその場合のみ)、URLの言語部分はストリップ言語パイプラインプロセッサーによって削除されます。'never'に設定されている場合、HttpRequestのURLに何もしません。これは、ストリップされたパスをLinkManagerからのプレフィックス付きパスと比較する場合、パスの比較を混乱させる可能性があります。

HttpRequest内のディクショナリに必要に応じて着信URLを追加するstripLanguageステップのにパイプラインステップを追加できます。

public class StoreOriginalRequestUrl : PreprocessRequestProcessor
{
    public override void Process(PreprocessRequestArgs args)
    {
        args.Context.Items["OriginalRequestUrl"] = args.Context.Request.RawUrl;
    }
}

...これは、アイテムリゾルバーの後のステップで取得できます。これがあなたがしていることだと思います-リクエストURLをLinkmanagerからのコンテキストアイテムのURLと比較します。

linkmanagerが返したUrl文字列をUriオブジェクトとして解析し、そこでパスを比較できると思います。完全修飾URLを指定すると動作が改善されるように思われるため、GetDefaultOptions()から返されたUrlOptionsを変更して提供します。

ポール

于 2012-08-01T22:25:38.097 に答える