2009/1/23 金曜日

PHPのheaderで304を返すと勝手にContent-Typeを書き換える問題

Filed under: IE7, php — admin @ 16:54:38

PHPのheader関数で304を返すと勝手にContent-Typeをtext/plainに書き換える。
どうやらcgi版のphp 5.2.6以前だけに起こるphpのバグらしいのだが,修正されている筈の5.2.8になっても治ってない。
header関数で、再度Content-Typeを指定してあげても、強制的にtext/plainに書き換えられるのでお手上げ。
本来は304 statusの時にはContent-Type自体送って来ないのが正しいです。

で、なんでこれが問題になるのかというと
IE7ではセキュリティ強化がされていて、キャッシュの内容とcontent-typeの異なる304 statusが返って来るとローカルキャッシュへのアクセスが拒否されてしまう。尚、firefox等の他のブラウザでは問題ない。

さらにうっとおしい事に、一度キャッシュに残ってしまうと『アクセスが拒否されました』というエラーメッセージと共にスーパーリロード(ctrl+F5)でも、キャッシュの再取得が出来なくなるということ、こうなると、直接、キャッシュフォルダを開いて該当のキャッシュファイルを削除するしか方法がなくなる。

おまけ
アクセスが拒否されましたというページは、内部javascriptによって以下のようなHTMLページが生成されています。

<html><head>
<script src="res://mshtml.dll/objectembed_neutral.js"</script>
</head><body objectSource="http://対象キャッシュファイルのURL"
onload="ObjectLoad();" leftmargin=0 topmargin=0 scroll=no>
<form id="objectDestination"></form>&lt/body></html>
No Tags

javascript 汎用イベント関数とイベント関数まとめ

Filed under: JavaScript — admin @ 15:34:21

基本的にaddEventListenerを使う。IEは現時点で対応してないのでattachEventを使う。※仮に今後対応した場合も大丈夫なようにしておいてある。これだけなら、どこにでもある実装で面白くないので、onXXXXX系(onclick等)のIE旧来イベントにも一応対応。記事としてはこっちがメイン。onXXXXX系は、複数指定すると、前の内容を上書きしてしまう特性がある。が、前の関数をappendすることによってそれを回避している。肝は自分自身の関数を一時的に別の変数に格納しているところ。ここを直接指定してしまうと無限ループに陥り、スタックオーバーフローを起こす。また、PHPの可変変数のようにwindow.onclick = window[”onclick”] のようにアクセスしているのもポイント。

/* Event関数 */
function addEvent(elm,type,func){
  if(! elm){ return false;}
  if (elm.addEventListener) { //for W3C DOM
      elm.addEventListener(type, func, false);
  } else if
     (elm.attachEvent)      { //for IE
      elm.attachEvent('on' + type, func);
  } else if     ( 'on' + type in elm)  { //onXXXX
      // 別の変数に格納しないと
      // 無限ループしてstack overflowを起こす
      f = elm[ 'on' + type ];
      elm[ 'on' + type ] = function(){
      if(f!==null){f();};func(); }
  } else {
    return false;
  }
}
No Tags