web-dev-qa-db-ja.com

HTML応答の変更(ヘッダーではない)

誰かが私を助けてくれるか、私を正しい方向に向けてくれることを願っています。

Akamai(または他のCDN、NGINX)が実際の応答本文を変更する方法を見つけるように依頼されました。

どうして?

外部リソースリクエストに「//」を使用するようにアプリコードを変更する代わりに、CDNがすべての「http://」リクエストを「https://」に変更するようにします。

これは可能ですか?

知ってる?

19
Charlie

これは多くの異なるアプローチを介してpossibleのように見えますが、advisable実際にはそうかもしれません。

潜在的に問題があるように思われ(例:書き換えるべきではないものを書き換えたらどうなりますか?)、マシンのリソースを集中的に使用します(応答ボディを繰り返し解析および変更するために多くのCPUサイクルが発生します)。

私が見つけたものは次のとおりです。

Nginxには http_sub_module があり、これはかなり簡単な方法でこれを達成するように見えます。置き換えたいものは単純で、<a href="http://example.com/... with <a href="https://example.com/...、1回以上。この種のコンテンツの愚痴は大ざっぱなように見えますが、あなたがいる状況に応じて(アプリケーションの制御が制限されている場合があります)、それはmightgetそこのあなた。

http_substitutions_filter と呼ばれるものがあるように見えます。おそらく非公式であるか、少なくともコアベースのNginxディストリビューションの一部ではないため、応答ボディのより強力なフィルターベースの書き換えが可能です。

ワニス 持っているようです 同様の機能(おそらくプラグイン)ですが、HAProxy does n't です。これは、gzipオフロードを行う場合を除き、ヘッダーのみを処理し、本文をそのままにするためです。 ApacheやSquidのような他のリバースプロキシ対応ソフトウェアも、アプリケーションサーバーの前に置くと便利なものを提供します。

私の最初の印象は、いずれにせよ、単純な文字列の置換では十分ではないかもしれませんし、正規表現を大幅に洗練することなく、正規表現ベースの置換でさえ十分ではありません。してはいけません。

この目的を最も正確な方法で達成するために「本当に発生する必要がある」と私が提案するのは、生成されたHTMLをDOM解析ライブラリで実際に解釈し、ツリーをトラバースし、関連する要素をその場で修正することです改訂された文書を要求者に渡す。このようにして、ドキュメントはその内容の文脈上の理解に基づいて変更されます。

私の意見では、それは複雑だと思うので、あなたの制御外にない限り、計画されたアプローチを再検討することをお勧めします。

最終的な考え:好奇心が私を最高にしたので、この質問に答えて、(異なる目的のために)作成したhttpリバースプロキシを改造しました。これにより、コンテンツタイプに基づいて、HTML構造を実際に解析し、適切なエンティティ、上記のように適切なエンティティを変更してから、応答本文をリクエスタに返します。

予想通り、これはかなりプロセッサを集中的に使用することが判明しました。私のテストコンテンツは、ライブサイトの29Kの実世界のHTMLで、56 <a href ...>および6 <link rel ...>要素、および書き換え操作には1 GHz Opteron 1218では128ミリ秒、2.4 GHz Xeon E5620では43ミリ秒が必要でした。これらのベンチマークは、実際の「プロキシ」機能自体に必要な(より短い)時間を除いて、厳密に追加操作用です。この時間のコストは克服できないものではありませんが、多くのCPU時間になる可能性があります。これは、正規表現ベースのコンテンツの書き換えにかかるよりもはるかに長くなりますが、はるかに正確で、触れているページを壊す可能性は低いです。

14

NginxのHttpSubsModuleは私にとっては素晴らしい仕事でした: http://wiki.nginx.org/HttpSubsModule

Httpからhttpsへの変更は、次のように簡単です。

location / {
    subs_filter_types text/html text/css text/xml;
    subs_filter http.example.com https.example.com gi;
}
10
Raptor

まったく同じですが、正しい構文です。

location / {
    sub_filter_types text/html text/css text/xml;
    sub_filter 'http.example.com' 'https.example.com';
}
7
Arnaud Weil