2007年4月27日金曜日

PATH_INFOに「%2F」が含まれていると404エラーになる(AllowEncodedSlashesで 解決)

SEO対策として、PATH_INFOを使ってパラメータをphpスクリプトに受け渡す方法が一般的になりつつあります。

参考:phpスクリプトに拡張子なしでアクセスするためには

自分もこれまでさんざんこのやり方を使っていましたが、つい最近、PATH_INFOの中に「%2F」が含まれているとapacheが404エラーを返すことを知りました。ちなみに「%2F」は「/(スラッシュ)」にURLエンコードをかけた後の文字列です。

http://www.example.com/product.php/id/1234/code/ABC%2FDEF

たとえば上記の例。apacheの設定がデフォルト状態だと404エラーになります。
これを解消するにはAllowEncodedSlashesをOnにします。

AllowEncodedSlashes On

httpd.confやVirtualhostディレクティブにこの記述を追加してapache再起動します。
なお、この設定はApache 2.0.46以降でのみ有効だそうです。あとmod_rewriteなどを使うときにもAllowEncodedSlashesをOnにしていないとエラーが起こるようです。

2007年4月24日火曜日

cseでMySQL5に接続する

cse(Common SQL Environment)という、mysql、pgsql、oracleなどのDBMSに接続し、操作できるwindowsアプリケーションがあります。かなり便利なソフトで、以前はよく使っていました。が、このところもっぱらphpMyAdminを使うのでcseはまったく使わなくなっていました。

さて、今回仕事で、開発が完了したWebアプリのテーブル定義書を作ることになりました。ここでcseには右クリック一発でテーブル定義書を作成できるという便利な機能があることを思い出し、久しぶりにcseを起動しました。が、、、

mysqlに接続しようとすると、致命的なエラーを吐いて強制終了。困った・・・

調べてみると、cseはmysql3以下にしか対応していないんだそうです。なるほど。どうりで接続できないわけだ。

さらに調べてみると、ODBCでmysqlに接続すれば問題なく使えるというページを発見。さっそく試してみます。

まずはmysqlのodbcコネクタをダウンロードし、インストール。

http://dev.mysql.com/downloads/connector/odbc/3.51.html

上記ページから、mysql-connector-odbc-3.51.14-win32.msiをダウンロードしてインストール。続いてコントロールパネル>管理ツール>ODBCで接続情報を設定します。

以上で準備完了。cseを立ち上げ、先ほど作ったodbcデータソースを選択すると、、、接続成功!!

もちろん、テーブル定義書もバッチリ作成できました。

テーブル定義書ってまじめに作ると結構大変なので、相当な時間と労力を節約できたと思います。よかったよかった。

2007年4月20日金曜日

RAID対応外付ハードディスク「RHD2-U1.0T」を購入

IO-DATAの「RHD2-U1.0T」を買いました。
500GBのHDDが2基で合計1TB。RAID0(ストライピング)とRAID1(ミラーリング)に対応しています。接続デバイスはUSB2.0。ネットワークには対応していません。
I-O DATA RAID 0・1対応 USB 2.0/1.1 ハードディスク 1.0TB RHD2-U1.0T

価格: 47,250円
アイ・オー・データ
目的はエブリオで撮った0歳の息子の動画データを保管するため。
データが増えていく量はだいたい月2~6GBくらい。何かイベントごとがあったりするとデータ量がぐーんと増えます。これまでは『動画データを一旦余り物の30GBのHDDに格納し、データがたまってきたらDVDに焼く』という方法で保管していたんですが、かなり面倒な上焼くのに時間がかかるのでギブアップ。大容量HDDを買ってそこに放り込んでいくというやり方に変更しました。これで手間がかなり減るはず。
またRAID1ミラーリングを使うので、ディスク故障でデータが飛ぶ危険性も低くなります。非RAID単体ディスクよりかなり値段が高いですが、お金で買えない大切なデータを格納するためということで奮発しました。
なお、RAID1なのでデータの書き込みはやはりかなり遅め。体感速度ですが、普通の単体ディスクに書き込むのより2倍くらい時間がかかっている気がします。それでもDVDに焼くよりは断然早いし、そんなに頻繁に使うわけでもないので特に困ることはないと思います。
なお、普段使っているPCのデータは以前データを復旧した時に買った2.5インチの外付けHDDを使用するようにしています。コンパクトで転送速度も速いので、バックアップなど頻繁に使うのには2.5インチが便利ですね。
ハードディスクは大容量化、低価格化が進み、種類も豊富になっているので、これからは用途に応じて使い分けをするのがいいのかもしれません。
・ ・ ・
それから最後に。
「RHD2-U1.0T」に付属している「Sync with」というフォルダ同期ソフトを使ってみたんですが、何度やっても実行途中にエラーを吐いて落ちてしまいました。
仕方ないので「RealSync」というフリーのソフトを使いましたが、こっちは安定しています。というかシンプルで使いやすいので、こっちのほうが断然良いです(^-^;

2007年4月17日火曜日

PEAR::HTML_QuickFormについて色々

■リンク
addElementの第一引数で「link」というのが指定できる。下記のような感じ。
$form->addElement('link', "link_name", "link_label", 'http://www.yahoo.co.jp/', 'link_text', array("target"=>"_blank"));

これといって使い道は思い浮かばないですけど、一応メモしときます。
■unfreeze
よく使うfreezeのほかに、unfreezeもあるのを発見しました。
フォーム全体を凍結して、特定のフィールドだけ凍結解除、なんてことをやる場合は便利です。
なお、フォーム全体を凍結した後にhierselectフィールドをunfreezeすると、JavaScriptのonChangeが抜けてしまった状態でフォームが表示されるという問題もあるようです。こちらは解決法見つけられず。。
■複数選択セレクトメニュー(multiple select)

$DeptArray = array("1" => "営業部", "2" => "経理部", "3" => "人事部");
$form->addElement("select","user_dept","所属部署",$DeptArray);
$deptObj =& $form->getElement("user_dept");
$deptObj->setMultiple(true);

こんな感じで複数選択可能なセレクトメニューが使えます。
デフォルト値セットで値が複数ある場合は、カンマ区切りで値を渡せばいいみたいです。
■php4の場合は「&=」を使う
$deptObj =& $form->getElement("user_dept");

みたいな感じで、php4の場合「=&」を使わないダメです。(「参照渡し」って名前だったかな?)
いつもphp5で「=」だけで書いてるので、コピペとかするときによく間違えます。要注意

China Unicomからの大量アクセスを拒否

サーバー負荷が高くなっていたので、ログを調べてみたら
220.194.55.47

から大量のアクセスがあることがわかりました。ユーザーエージェントは
KDDI-SA31 UP.Browser/6.2.0.7.3.129 (GUI) MMP/2.0

auの携帯?と思ったんですが、上記IPを調べてみると

inetnum: 220.192.0.0 - 220.207.255.255
netname: UNICOM
descr: China United Telecommunications Corporation
descr: No.133,Taiyun Building,Xidan North Street
descr: Xicheng District,Beijing,China
country: CN   → (中国)

となっています。
中国 China Unicom」でググってみると、KDDIとの技術協力うんぬんというページが見つかります。
なので一瞬「KDDIがUNICOMと共同で検索エンジンロボットのテストでもしているのかな?」と思ったんですが、だったらユーザーエージェントに何かメッセージが入ってると思うので、やっぱり偽装だろうという結論に至りました。
というわけでさっそくアクセス拒否。すぐに効果があらわれて、サーバー負荷も落ち着きました。

2007年4月12日木曜日

mod_rewriteでリダイレクト。ただし画像は対象から外す

以前、「mod_rewriteを使って特定のIPやホストからの接続の場合のみ、コンテンツを表示する」というのをやりました。
今回その条件に加えて「ただし画像(gif,jpg,png)は処理の対象から外す」というのを付け足しました。
こんな感じです。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|jpeg)$ [NC]
RewriteCond %{REMOTE_ADDR} !^192.168.1.$
RewriteCond %{REMOTE_ADDR} !^172.0.0.1$
RewriteRule .* ___maintenance.html

この設定の場合、飛ばし先が「___maintenance.html」になります。この「___maintenance.html」にて同一サーバー上の画像の呼び出しをしており、画像をリダイレクト対象から外す必要があったので、このような設定になりました。