Permission denied to call method XMLHttpRequest.open
で検索してくる方が多いのですが、クロスドメインではなく、別ポートにリクエストを出す際に上記のエラーが出る問題であれば一応解決が出来たので記しておこうと思います(ちなみに、これが正しい方法なのかは良くわからないです)。
タイトルにあるとおり、喩えクロスドメインでなくても、ポートが違うとFirefoxでは
Permission denied to call method XMLHttpRequest.open
というエラーが出て、リクエストを発行することが出来ません。つまり、
というjavascript をダウンロードしたとして、そのスクリプトから
に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 のIP)/a.xml
をXHRすると、全く同じエラーが出ました。今度は別ポートですらありません。同じIPの同じポートですが、字面が違うだけなのです。やっぱり名前ベースで判断しているように見えますね。でもFirefoxのソースを追いかける気にはなりませんし、これがバグなのか正しい仕様なのかどうかは僕にはよくわかりませぬ。