anti scroll

ブラウザと小説の新しい関係を模索する

Firefox における XmlHttpRequest 別ポートへのリクエスト対策

Permission denied to call method XMLHttpRequest.open

で検索してくる方が多いのですが、クロスドメインではなく、別ポートにリクエストを出す際に上記のエラーが出る問題であれば一応解決が出来たので記しておこうと思います(ちなみに、これが正しい方法なのかは良くわからないです)。

タイトルにあるとおり、喩えクロスドメインでなくても、ポートが違うとFirefoxでは

Permission denied to call method XMLHttpRequest.open

というエラーが出て、リクエストを発行することが出来ません。つまり、

http://hogehoge.com/test.js

というjavascript をダウンロードしたとして、そのスクリプトから

http://hogehoge.com/a.xml

にXHRを飛ばすことは出来ても、

http://hogehoge.com:8080/b.xml

にXHRを飛ばすことは出来ないのです。

というわけで、今回はサーバ側で mod_rewrite、mod_proxy を使ってズルをすることにしました。

つまり、上のリクエストをするならば、javascript から

http://hogehoge.com/proxy/b.xml

などと間にproxy なんてpath を含めたRequest を出して、サーバ側で、それを

http://hogehoge.com:8080/b.xml

へとリレーするわけです。

apache2.2 ではこういう感じにしたら上手くいきました。

RewriteEngine On
RewriteRule ^/proxy/b.xml$ http://localhost:8080/b.xml [P,L]

こうすると、あっさりXHR が通りました。

ようするに、Firefoxは、リクエストを出す際のURL文字列が名前ベースでクロスドメイン制約に抵触していないかをチェックするだけで、実際にコネクションが繫がった際の相手方ポート番号までは見ていないということなのでしょうか。

単にホスト名を文字列比較して違っていたらクロスドメイン、とかって判断しているのかもしれません。

ためしに、

http://hogehoge.com/a.xml

の変わりに、

http://(hogehoge.com のIP)/a.xml

をXHRすると、全く同じエラーが出ました。今度は別ポートですらありません。同じIPの同じポートですが、字面が違うだけなのです。やっぱり名前ベースで判断しているように見えますね。でもFirefoxのソースを追いかける気にはなりませんし、これがバグなのか正しい仕様なのかどうかは僕にはよくわかりませぬ。