[解決済み] HTTPS ページにおける HTTP コンテンツの扱いについて
質問
全てHTTPSでアクセスするサイトがあるのですが、時々 外部コンテンツ を表示することがあります (主に RSS フィードの画像)。 また、私たちのユーザーの大半は IE6 で止まっています。
私は理想的には、次の両方を行いたいと思います。
- 安全でないコンテンツに関する IEの警告メッセージを表示しないようにする (たとえば、画像を以下のようなデフォルトのアイコンに置き換えることで、より控えめなものを表示できるようにする)
- どの画像が読み込まれていないかを調べ、代わりに私たちの画像に置き換えるために実行できる JS があれば、それは素晴らしいことです。
最初の目的は単純に不可能だと思いますが、2 番目の目的は十分かもしれません。
最悪のシナリオは、RSS フィードをインポートするときに解析し、画像を取得してローカルに保存し、ユーザーがその方法でアクセスできるようにすることですが、それは合理的に小さな利益のために多くの苦痛のように思えます。
どのように解決するのですか?
最悪のシナリオは、あなたが思っているほど悪くないのです。
あなたはすでにRSSフィードを解析しているので、画像のURLはすでに持っています。例えば、次のような画像 URL があるとします。
http://otherdomain.com/someimage.jpg
. この URL を次のように書き換えます。
https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. こうすることで、ブラウザは常にhttpsでリクエストを行うようになり、問題が解消されます。
次の部分 - プロキシページまたはサーブレットを作成し、次のことを行います - 。
- クエリ文字列から url パラメータを読み取り、ハッシュを検証します。
- サーバーから画像をダウンロードし、ブラウザにプロキシで返します。
- オプションで、画像をディスクにキャッシュします。
この解決策にはいくつかの利点があります。html を作成するときに画像をダウンロードする必要がない。画像をローカルに保存する必要がありません。また、ステートレスです。urlには画像を提供するために必要なすべての情報が含まれています。
最後に、hashパラメータはセキュリティのためです。サーブレットが画像を提供するのは、あなたが作成したURLに対してのみです。そのため、url を作成する際に
md5(image_url + secret_key)
を計算し、それをハッシュパラメータとして追加します。リクエストを処理する前に、ハッシュを再計算し、渡されたものと比較します。secret_key はあなただけが知っているので、他の誰も有効な URL を作成することはできません。
もしあなたがJavaで開発しているなら、サーブレットは数行のコードです。他のバックエンド技術に以下のコードを移植することができるはずです。
/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/
protected void proxyResponse (String targetURL, HttpServletRequest request,
HttpServletResponse response) throws IOException {
GetMethod get = new GetMethod(targetURL);
get.setFollowRedirects(true);
/*
* Proxy the request headers from the browser to the target server
*/
Enumeration headers = request.getHeaderNames();
while(headers!=null && headers.hasMoreElements())
{
String headerName = (String)headers.nextElement();
String headerValue = request.getHeader(headerName);
if(headerValue != null)
{
get.addRequestHeader(headerName, headerValue);
}
}
/*Make a request to the target server*/
m_httpClient.executeMethod(get);
/*
* Set the status code
*/
response.setStatus(get.getStatusCode());
/*
* proxy the response headers to the browser
*/
Header responseHeaders[] = get.getResponseHeaders();
for(int i=0; i<responseHeaders.length; i++)
{
String headerName = responseHeaders[i].getName();
String headerValue = responseHeaders[i].getValue();
if(headerValue != null)
{
response.addHeader(headerName, headerValue);
}
}
/*
* Proxy the response body to the browser
*/
InputStream in = get.getResponseBodyAsStream();
OutputStream out = response.getOutputStream();
/*
* If the server sends a 204 not-modified response, the InputStream will be null.
*/
if (in !=null) {
IOUtils.copy(in, out);
}
}
関連
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] updateとdeleteのHTTPステータスコード?
-
[解決済み] カスタムHTTPヘッダー:命名規則
-
[解決済み] HTTPSのURLは暗号化されていますか?
-
[解決済み] リソースが既に存在する場合の POST に対する HTTP レスポンスコード
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み】HTTPとHTTPSのパフォーマンス比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ExpressJSのX-Powered-Byを削除する方法 [重複]。
-
[解決済み] IISファイルのダウンロードがハングアップ/タイムアウトする - sc-win32-status = 64
-
[解決済み] HTTP_CLIENT_IPとHTTP_X_FORWARDED_FORの違いは何ですか?
-
[解決済み] HTTPポストで文字+が%2Bに変換される
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] 検証失敗または重複が無効な場合のREST HTTPステータスコード
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】Node.jsのほとんどのポートでリスニングするとEACCESエラーが発生する。
-
[解決済み】Cross-Origin Request Headers(CORS)とPHPヘッダとの関係
-
[解決済み] HTTPのPOSTメソッドをキャッシュすることは可能ですか?