解決:window.open()を使いつつIEでRefererを渡す方法

■読む前に知って欲しい事

window.open()を使って他のHTMLファイルを開くと、IE以外のブラウザはちゃんとリクエストヘッダーに『Refererをつけて』くれる。

■InternetExplorer(以下、IE)は?

例えば、

window.open(“test.html”,”sub”●●●●●●) ;

とすると、なんとRefererをセットしない。

■困る事

  • アクセスログを取る際に困る
  • セキュリティ上の理由でRefererが必須になる場合、window.open()が使えない

■従来の解決策

target=”_blank”で通常通りリンクする

■これからの解決策

まず、これがソースだ!

function createHttpRequest(){
	if(window.XMLHttpRequest){
		return new XMLHttpRequest();
	}
	else{
		if(window.ActiveXObject){
			try{return new ActiveXObject("Msxml2.XMLHTTP");}
			catch(e){
				try{return new ActiveXObject("Microsoft.XMLHTTP");}
				catch(e2){return null;}
			}
		}
		return null;
	}
}
function openWindow(FILE){
	var request = createHttpRequest();
	request.open("POST", FILE + ".html");
	request.setRequestHeader("Referer",document.URL);
	request.send("");
	request.onreadystatechange = function(){
		if(request.readyState == 4 && request.status == 200){
			var tmpTxt = request.responseText;
			subWin= window.open("","sub","width=............................");
			top.subWin.document.write(tmpTxt);
			top.subWin.document.close();
			subWin.focus();
		}
	}
}

つまりwindow.open();で空のウインドウを開かせて
バックグラウンドでリファラー付きの非同期通信をし
飛び先のHTMLソースを取得しちゃう。

■注意点

  • ポップアップとして開くウインドウは必ずUTF-8で保存する事。
  • metaタグのcharsetも書き換えてね!
  • request.openのところは適宜GET、POSTを置き換えてください!(サーバーの設定によりますが静的データのリクエストにPOSTが使えない事が多いようです)

■+α(更に改善するには…)

  • Operaなんかはポップアップの警告が出るようになるのでブラウザごとに条件分岐してみる?
  • そもそもIEだけがRefererを飛ばさないのでIEだけに適用するようにする?
  • createHttpRequestをグローバルにしておくのはもったいない。

■今回の著作権について

  • 商用、非商用かかわらず自由にご利用ください。
  • リンクしてくれると、なお嬉しい!

解決:window.open()を使いつつIEでRefererを渡す方法” への10件のコメント

  1. ピンバック: Just One Planet

  2. index.htmlページで、window.openを利用し、メニューバーの無い画面を出すようにしたら、

    が利用できなくなり、ここにたどり着いた者です。
    是非、利用してみたい!と思うのですが、どの分に、新しく開きたいページのURLを入れて、どの部分に、サイトのURLを入れれば良いのか良くわからず、画面が真っ白になってしまいます。
    注意事項にあった3項目は、設定しました。
    どうか、ご教授お願いします!!

  3. すみません、javascriptをそのまま書いてしまいました。
    if (document.referrer.length !=0 ){
    }
    else{
    location.href = “サイトのURL”;
    }
    が、利用できなくなってしまいました。

  4. コメントありがとうございます☆

    まず上述のスクリプトを読み込むなり
    htmlファイルに書き込むなりします。

    次にhtml内の任意の要素にonclickもしくはhrefで
    openWindowが動作するようにします。

    その時に例えば
    openWindow(‘test’);
    とすると、
    記述したhtmlファイルと同じ階層にある
    test.htmlがポップアップウィンドウに表示されます。

    //==================================================
    subWin= window.open(“”,”sub”,”width=……………………….”);
    の部分とかは適宜、適当な引数を記述してください。

    //==================================================
    2年近く前のソースなので自分で改めてみると
    ちょっと恥ずかしいですね。。。

    何かご不明な点がありましたらお気兼ねなく
    コメントくださいませ。。。

  5. お返事頂きまして、本当に感謝しております。
    がんばって、やってみたいと思います!
    また、来ます!!!

  6. スクリプトを理解していないので、とても難しいです・・・汗。
    URLをここにずばり書いても良いのかどうかわからないので
    http://www.bbb/aaa/というサイトに、window openで
    http://www.ccc/bbb/1.htmlというリンクを貼っています。
    同じサーバーではありません・・・。

    <まず上述のスクリプトを読み込むなり
    htmlファイルに書き込むなりします>
    ということは、http://www.ccc/bbb/a1.htmlという、スクリプトを動かしたいhtmlに書くという事で間違いないでしょうか。

    それから
    subWin= window.open(””,”sub”,”width=……………………….”);
    ””,”には、http://www.bbb/aaa/というサイトのURLを入れるのでしょうか?
    ”sub”には、何を入れたらいいでしょうか?

    色々試してみたのですが、indexとhtmlが別のサーバーにあるからなのか、うまくいきません・・・。

    こんな初心者を相手にするのも大変でしょう、申し訳ありません、でも、これはすごいぞ!と思って・・・。
    同じ階層ならうまくいくかも、別のhtmlで試してみます!

  7. すみません。。。
    先に言えば良かったのですが

    XMLHttpRequestを使っているのでドメインが異なる場合は
    通信が出来ないのです。
    従いましてウインドウが開いても何も表示されない
    という事になってしまいます。

    またwindow.openの引数については
    http://www.tohoho-web.com/js/window.htm#open
    こちらを参考にすると良いと思います。

    //==================================================
    ちなみにですが
    子ウィンドウでIframeを使い
    他ドメインのサイトを呼び出せば
    確かRefererもセットされた気がします。

    あまり美しい方法ではありませんが如何でしょうか?

    気になったのですがりファラーは必須でしょうか?
    必須でなければ通常のwindow.openでも目的は達成されると思います。

    また何か問題があるようでしたら
    お尋ねくださいませ☆

  8. ピンバック: オンポタメモ » links for 2009-06-29

  9. みなどうやってるのだろうと検索したら辿り着きますた、
    リファラーを得る目的ではないが、新しいウィンドウの表示を切り替える目的で、ウィンドウ名を利用しています。
    window.name なら自分のウィンドウの名前を得られるので、
    window.openの第二引数(ウィンドウ名)に特殊な名前を与えて、新しいページで参照する、という方法をとっています。
    もちろん
    window.open(‘URL’, location.href,width=……)とすればよさそうですが IE では文字列の内容からエラーになるので英数とアンダーバーに置換えする必要があります。
    めんどいので現在は固有のストリングをねじこんでますが、もちろん秘匿性はないので使い道は限られると思います。

  10. ピンバック: IEで確認した時にリファラが取れない場合の対処法 | ミラボ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です