web-dev-qa-db-ja.com

F5ネットワークiRule / Tcl-UNICODE 6文字のエスケープシーケンスをエスケープして、6文字のシーケンスとして処理され、再挿入されますか?

F5 BIG-IP LTMiRuleをSharePoint2007でSSLターミネーションの役割で正しく動作させようとしています。このアーキテクチャは、すべてのSSL処理をF5にオフロードし、F5はインタラクティブな要求/応答をHTTP経由でのみ(安全なネットワークを介して)SharePointフロントエンドサーバーに転送します。

この説明の目的上、iRulesはF5ネットワークスBIG-IPデバイス上のTcl解釈エンジンによって解析されます。

そのため、F5は通過するトラフィックに対して2つのことを行います。

  1. HTTP 302リダイレクトとURL書き換えを介して、ポート80(HTTP)への要求をポート443(HTTPS)にリダイレクトします。
  2. ブラウザへの応答を書き換えて、HTMLに埋め込まれたURLを選択的に書き換え、ポート443(HTTPS)に移動します。これにより、302リダイレクトがSharePointによって生成されたDHTMLを壊すことを防ぎます。

パート1は正常に機能しています。

パート2の主な問題は、XML名前空間やその他の同様の問題のために応答の書き換えで、「http:」のすべての一致を「https:」に変更できるわけではないことです。一部は「http:」のままにする必要があります。さらに、一部の「http:」URLは、SharePointで生成されたJavaScriptに存在し、スラッシュ(つまり、「/」)は実際にはHTMLでUNICODE6文字の文字列「\ u002f」で表されるという点で困難です。

たとえば、これらのトリッキーなものの場合、送信HTMLのリテラル文字列は次のとおりです。

http:\u002f\u002fservername.company.com\u002f

そして、次のように変更する必要があります。

https:\u002f\u002fservername.company.com\u002f

現在、これらのUNICODEシーケンス文字列リテラルの検索/置換式で一致を取得する方法を理解することさえできません。どのようにスライスしても、Tclインタープリターは他の処理を行う前に「\ u002f」文字列を「/」変換に解釈しているようです。

私たちが知っているTclエスケープメソッドのさまざまな組み合わせを試しましたが(主に二重引用符で囲み、余分な「\」を使用してUNICODE文字列の「\」をエスケープします)、より多くのメソッド、できれば機能するメソッドを探しています。

誰かがこれについて効果的に自己教育できる場所へのアイデアや指針を持っていますか?

よろしくお願いします。

@JD、私はおそらくこれを追加する必要がありました:

問題のSharePointWebアプリケーションは、現在、SQL Server 2005 Reporting Services(SSRS)およびPerformancePoint 2007(PPS)と(他のWebアプリケーション上で)統合されている物理サーバーおよびSharePointファームでホストされています。どちらの製品も、代替アクセスマッピング(AAM)をサポートしていません。

上記で実行したいWebアプリケーションがSSRSまたはPPSと統合されていないのは事実ですが、アーキテクトと技術リーダーは、可能な限りその環境でAAMを使用しないことを望んでいます。

したがって、原則として私はあなたの答えに同意しますが、この場合、私と他の技術戦略家はこれがこの特定の状況で正しい答えであると信じているので、特別な例外を求め、特にTclとUNICODEのエスケープについて尋ねています。

1
Malcolm Gin

SharePointで実行しようとしていることはお勧めしません。

推奨されるアプローチは、SharePoint内で代替アクセスマップを使用することです。 https://のパブリックURLを作成し、内部名をhttp://にします。

これにより、ページ上のすべてのURLがhttps://を使用して作成されます。

答えが気に入らない場合は、ServerFaulthttp://serverfault.comでこれを尋ねることができます。

1
JD

SharePointについては何も知りませんが、少なくとも純粋なtclの観点から、リテラル文字列を照合する方法を以下に示します。

tclsh> set string {http:\u002f\u002fservername.company.com\u002f}
http:\u002f\u002fservername.company.com\u002f
tclsh> regexp {http:\\u002f} $string
1

重要なことは、\ u002fのバックスラッシュがtclパーサーによって解釈されないようにすること(パターンを{}で囲むことによって)、およびバックスラッシュが正規表現パーサーによって解釈されないことを確認することです(エスケープすることによって)。バックスラッシュ付き)。

0
Bryan Oakley

これも最近出てきたので、将来の参考のために...

Sharepoint代替アクセスマッピングは最もクリーンなソリューションです。

BIG-IP iRuleの場合、次のようなものを試すことができます。 TCLは、Unicode文字を照合する前に解釈する必要があることに注意してください。

when HTTP_REQUEST {
    # Disable the stream filter by default
    STREAM::disable
}
when HTTP_RESPONSE {
    if {[HTTP::header value Content-Type] contains "text"}{
        set find_str "http:\u002f\u002fservername.company.com\u002f"
        set replace_str "https:\u002f\u002fservername.company.com\u002f"

        STREAM::expression "@$find_str@$replace_str@"
        STREAM::enable
    }
}

アーロン

0
Aaron

\ 123\abcを\ 456\defに置き換えます

STREAM :: expression {@ \\ 123 @\456 @ @ \\ abc @\def @}

0
ben