« UserPrivateGroup の使いどころ | メイン | 和訳してみた »

Google Maps API を SSL で使えるようにしてみる。

2008/03 : /maps?file=api を書き換えるための正規表現のパターンを微調整しました。

2008/05/15 : 通りすがりさんの報告を受けて、正規表現のパターンをさらに微調整しました。

2008/07/25 : Google 側のコードに変更があったようで、機能しなくなったので、 正規表現のパターンを緩めに調整しました。

2009/07/19 : kobuchi さんの報告を受けて、修正しました。
Google 側のコードの変更により /maps?file=api だけではなく、そこから先で動的にロードされる JS ファイルの内部も書き換えることが必要になったので、そのように変更しました。

Google Maps API は HTTPS では提供されていないらしい。
(Google Analytics には HTTPS 版もある。というのは先日知りました。)

しかし、HTTPS なページに、HTTP なリソースを読み込むと IE 曰く、
「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています」と。

この問題を何とかしなければならない機会があったので、
HTTPS な proxy をかまして何とかしてみた。

要するに、 Google Maps API を使うためには、普通

http://maps.google.com/maps?file=api&v=2&key=...

っていう JavaScript を読み込むけれども、
まずこの JavaScript を https://(自前の proxy )経由でリクエストし、
この JavaScript にハードコードされている http://... を
https://(自前の proxy )経由でリクエストするように書き換えれば良いだけ。
以下は PHP での例。

デモ: https://ssl.tonextone.com/neta/gmap_over_ssl/

# SSL の証明書を買っていないので、その旨の警告は出ます。

./rewrite_gmaps_api.php


./proxy.php

トラックバック

このエントリーのトラックバックURL:
https://tonextone.com/type/app/mt-tb.cgi/18

この一覧は、次のエントリーを参照しています: Google Maps API を SSL で使えるようにしてみる。:

» LL-navi/制作/Mysidia制作/確認用Mysidia 送信元 LL-navi Development Wiki (PukiWiki/TrackBack 0.4)
SSLでGoogleMapsを使う プロキシを使うらしい https://tonextone.com/type/2007/10/02-0112.html [詳しくはこちら]

コメント (14)

でもやっぱり重い。

Hello,
can you make a version for people not using PEAR extensions?

Thanks

To: prova

thanks for your attention.

it is just a quick hack for my case.

i think i can make another version for someone (with her/his choice of HTTP-client),
but not for everyone (with hundreds of varieties of HTTP-client).

i hope its concept helps.

# sorry i am too late to reply.

とても助かりました。
しばらく試験していたところ、IE が証明書の警告を出したので、調べると

http://maps.google.com/intl/en_ALL/mapfiles/110a/maps2

こんなレスポンスがあったので、rewrite_gmaps_api.php に
次の変更([0-9] → [0-9a-z])を行ったら、警告が消えました。
ちゃんと確認してないので、間違っていたらゴメンナサイ。

[変更前]
$pattern = array(
'<"(http://[^/\.]+\.google\.com/intl/en_ALL/mapfiles/[0-9]+/maps2)" *\+ *"(\.api/main\.js)">',

[変更後]
$pattern = array(
'<"(http://[^/\.]+\.google\.com/intl/en_ALL/mapfiles/[0-9a-z]+/maps2)" *\+ *"(\.api/main\.js)">',

通りすがりさん

こちらこそ、ご報告ありがとうございます。
試してみます。

PHPコードを参考にJavaで作りました。どうもありがとうございます。

Google の API 変更により、この方法では、現在 proxy しきれなくなっているようです...orz
すぐに思いつくような対策も無く、困りました。

いや、正規表現のパターン修正でいけた。
あとで追記します。

SSL経由でGooglemapを表示させる方法を探していて、
この記事を見つけました。参考になるエントリーをありがとうございます。

恐縮なのですが、一点質問させてください。
「https://★SERVER_NAME★/proxy.php/http://maps.google.com/intl/en_ALL/mapfiles/151e/maps2/main.js」
というように、中のURLの書き換えは成功しているのですが、
「proxy.php/~~/main.js」が"proxy.php"で動作せず、そのままのディレクトリ構造と認識してしまい
正しく動作しない状態です。

このような形式の引数渡し?には、何かサーバ側の設定が必要でしょうか。
申し訳ありませんが、ご教示頂ければ助かります。

宜しくお願いします。

phpinfo() を出力するだけの phpinfo.php を

https://★SERVER_NAME★/phpinfo.php

と配置して、

https://★SERVER_NAME★/phpinfo.php/foo/bar

をリクエストしたらどうなりますか?

phpinfo が出力されるようなら、 PATH_INFO が "/foo/bar" になっているかどうか確認してみてください。

phpinfo が出力されない、または PATH_INFO が取得できていなければ、 CGI として PHP を利用している可能性があります。

その場合は、こちらを参照してください。
http://jp.php.net/manual/ja/security.cgi-bin.php
http://jp.php.net/manual/ja/ini.core.php#ini.cgi.fix-pathinfo

あるいは、 Apache2 をお使いでしたら、この辺かもしれません。
http://httpd.apache.org/docs/2.0/ja/mod/core.html#acceptpathinfo

今現在、動作しています??
IE7でダイアログが出るようですが・・・

そのようです。ご報告、どうもありがとうございます。
今日明日中に、パターンを更新してみます。

ちなみにどう対処するかというと、
rewrite_gmaps_api を通した後の javascript のソースコードを見て、"http://"を探します。

https://ssl.tonextone.com/neta/gmap_over_ssl/rewrite_gmaps_api.php?file=api&v=2.x&key=ABQIAAAAWRicxZ_3m1Wk0AfH3OO7MxRAUcBNGVpT8Ki_cIVKwjvJeSp-ghTMKqB8GwTAwOb4RHwo-LHxFmHRuQ

つまり、 https の proxy を経由せずに、http でリクエストが発生しそうな部分を見つけます。

それで、 proxy し損なっている URL も含めて、ちゃんと proxy されるように、
正規表現のパターンを修正するわけです。

はじめまして。
現在、載っているソースでは動かないようですが、
最新のソースを教えていただけないでしょうか?
よろしくお願いいたします。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

アーカイブ

フィード

このブログ

RSS 2.0 / ATOM

AdSense

del.icio.us

flickr