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

2009/1/20 火曜日

IE7のGoogle検索窓を日本語ページ対応に

Filed under: IE7 — admin @ 15:16:44

最近IE6ベースからIE7にようやく乗り換えました。
で、IE7のGoogle検索窓が日本語に対応していなかったので、さっそく
OpenSerachで日本語googleに変更しようと思ったら…項目が見当たりませんのね。

その後、しばらく放置していたのですが、間違って検索窓を使って英語googleで検索してしまうことが
多く、そのたびにくやしい思いをするのが嫌だったのでぐぐってみました。

IE7のGoogle検索窓を日本語ページ対応に

レジストリ変えなきゃいかんのね。

No Tags

2009/1/15 木曜日

gmailで迷惑メールにならないようにする。

Filed under: gmail — admin @ 0:29:08

さくらインターネットでcatch-allする方法でしたが、実は失敗します。
というのは、gmailがMailer-Daemonを迷惑メールとして判定してしまうため
そこで、転送が止まってしまうからです。

基本的に、どうにもならないとwikipediaにも書かれていましたが、
世の中どうにかしている人はいるもので、こちらの記事を参考にして設定してみました。
Gmailの迷惑メールフィルタを無効にする

なんとか無事にできたようです。

あとは、ここの記事にも書かれていますが、定期的にログインさせないといけないみたい。

No Tags

2009/1/14 水曜日

さくらインターネットでメールをcatch-allしたい。(失敗編)

Filed under: gmail, sakura — admin @ 14:29:47

verpを使いたくて、メールをcatch-allしたかったのですが、さくらインターネットのレンタルサーバーはMTAにsendmailを使用している為出来ません。なのでgmailを一旦介して受け取るようにします。設定が複雑なので、そのときのメモを残しておきます。前提条件として

  • さくらインターネットの共有レンタルサービスを使用している。
  • さくらのドメインを使用している。

作業手順

  • google APPを登録
  • さくらのドメインでゾーン編集を行う
  • さくらのレンタルサーバードメイン設定
  • gmail側の設定
  • さくら側メール設定
  • verp処理プログラム

…あまりにも作業内容が長いので以下要点だけ

google APPを登録

ここでアカウントを登録無料のアカウント登録

さくらのドメインでゾーン編集を行う

1.まずはcatch-allしたい独自ドメインexample.comをgoogle APPに認証する為にgoogle APPで発行されたgoogleXXXXXXXXXXXXをサブドメインとして登録します。

 googleXXXXXXXXXXXXXXXX  CNAME  google.com.

※google.com.の行末の.(ドット)を付け忘れないように注意してください。2.次に認証が通ったらgoogle APPのMXを登録します。ここで元から設定されていたさくらへのMXは削除します。3.SPFを記述します。google APPからの送信と、さくらの共有サーバーからの送信を許可しておきます。※SPFの設定についてはこちらを参照させて頂きました。

@ NS  ns1.dns.ne.jp.  NS  ns2.dns.ne.jp.  MX  10 ASPMX.L.GOOGLE.COM.  MX  20 ALT1.ASPMX.L.GOOGLE.COM.  MX  20 ALT2.ASPMX.L.GOOGLE.COM.  MX  30 ASPMX2.GOOGLEMAIL.COM.  MX  30 ASPMX3.GOOGLEMAIL.COM.  MX  30 ASPMX4.GOOGLEMAIL.COM.  MX  30 ASPMX5.GOOGLEMAIL.COM.  TXT  "v=spf1 +a:wwwXXX.sakura.ne.jp include:_spf.google.com ~all"  googleXXXXXXXXXXXXXXXX  CNAME  google.com.  mail  A  AAA.BBB.CCC.DDD  ftp  A  AAA.BBB.CCC.DDD  www  A  AAA.BBB.CCC.DDD

※ 注意)NSはさくらのDNSに自動的に設定されるのでここでは設定しないように、設定するとおかしくなります。

さくらインターネットのレンタルサーバー側(WEBサーバー)のドメイン設定

通常のさくらのドメインを使用する設定ではなく『他社で取得、または他社で管理中のドメインを移して使う>> ドメインの追加へ進む (非推奨)』で追加するようにします。

gmail側の設定

ret+*@example.comに来たメールをret-XXX@XXXXXX.sakura.ne.jpの固定アドレスへ転送するように設定します。verpは本当は-(ハイフン)を使うので本来はret-*@example.comなのですが、gmailのエイリアス機能は+なので+を使います。 ちなみに+記号をメールアドレスに使うのはRFCに準拠してないです。なので、gmailのエイリアスはWEBサービスの登録に使う場合に使えないことが多いです。ちなみに+文字はメールアドレスでは特別な意味を持ちます。あんまり使わないので詳細は忘れました(笑)。話が脱線しましたが、verpでは問題ないのでこんな設定で行きます。※ 尚、gmailのキャッチオールアドレス機能は使いません。エイリアス機能のみ使います。1.新しいユーザーを作成

姓 return 名:addressユーザー名: ret @example.com

2.新しいユーザーでログイン3.メール転送とPOP/IMAP設定

次の宛先にメールを転送受信メールをXXX@XXX.sakura.ne.jpに転送しメールのコピーを削除

さくら側メール設定

/HOME/ユーザー名/Mailbox/XXX/.mailfilter

.mailfilterの設定内容はこんな感じ

to "| /home/ユーザー名/bin/verp.php 2>&1 >> /home/ユーザー名/logs/verp.log"

でVERPを処理するプログラムを記述テスト中は上の用にログを吐いておくとデバックしやすいが、放置しておくとログがサーバーのディスク容量を圧迫するので、安定稼動したら以下のように/dev/nullに捨てておくこと。

to "| /home/ユーザー名/bin/verp.php 2>&1 >> /dev/null

verp処理プログラム

qmailでは環境変数(Return-Path)から取り出していたところをメールヘッダーのDelivered-Toあたりを抜き出してret+hogehoge=sample.com@example.jpを処理する。くどいようですが”-”を”+”に変えるのを忘れない。phpのプログラムサンプル

#!/usr/local/bin/php -q< ?$prefix    = "ret";$delimiter = '+';$delimiter = preg_quote($delimiter);$domain    = "example.com";$domain    = preg_quote($domain);$alnum     = "a-zA-Z0-9";$target    = "Delivered-To";     $regex     ='/'."^".$target.": ".$prefix.$delimiter."("."[{$alnum}_.-]+"."=[{$alnum}_.-]+."."[{$alnum}]+".")"."@".$domain.'/';echo "正規表現: ".$regex."n";     $buffer   = file("php://stdin");foreach($buffer as $buf){  if(!$is_body and preg_match($regex,$buf,$match)){    $verp = $match[1];    $verp = str_replace("=","@",$verp);    echo "VERPアドレス: ".$verp."n";  }  if(preg_match("/^(n|rn|r)$/",$buf)){    $is_body = true;  }}print_r($buffer);

No Tags