カテゴリー
プログラミング

mod_rewriteを活用する

■mod_rewriteって?

mod_rewriteはApacheのモジュールです。
インストールされていない場合は使用できません。
root権限が無い限り新たにインストールすることは難しいかと思います。

インストールされている場合は下記の方法で使用します。

httpd.confに設定する(処理速度速い)
.htaccessに設定する(処理速遅い)

しかしhttpd.confに設定する場合はroot権限が必要です。
また、httpd.confの更新内容を有効にするには、httpd.conf編集後にApacheを再起動する必要があります。


■mod_rewriteの設定例


・サイトの引越し時のリダイレクト


RewriteEngine on
RewriteRule ^/(.*)$ http://www.newsite.com/$1 [R=301,L]

この方法が有用な点は、R=301 という指定で、HTTPステータスコードの301(Moved Permanently、永久に移動したという意味)を返せる事です。
検索エンジンのロボットがアクセスした場合には、ステータスコード301によってURLが変更されたと読みとってくれます。
Googleでしたらほぼ、PageRankを引き継げるのではないかと思います。


・動的ページのURLを静的ページのURLに変換


RewriteEngine on
RewriteRule ^/cgi-bin/sample/([0-9A-Za-z]+)/([0-9A-Za-z)]+)/?$ /cgi-bin/sample.cgi?a=$1&b=$2 [L]

上の例では
http://www.hoge.com/cgi-bin/sample/123/abc
でアクセスすると

http://www.hoge.com/cgi-bin/sample.cgi?a=123&b=abc
にリダイレクトします。

静的URLの利点はロボット型検索エンジンにクロールやキャッシュされやすいという事です。
検索エンジンのロボットは動的URL(URLの最後が .cgi で終る)にはあまり対応していないために無視されることが多くなります。

カテゴリー
プログラミング

.htaccessを使ってURLをリダイレクト

リダイレクト元のディレクトリが sample/ だとしてリダイレクト先がhttp://www.hogehoge.com/だとすると以下のように.htaccessに書き込み sample/ディレクトリにアップロードします。

Redirect permanent /sample/ http://www.hogehoge.com/
カテゴリー
正規表現

改行コードの変換

改行コードはWin、Mac、UNIXとプラットフォームによって異なるがperl上では全て \n で統一されている。

改行コードを全て統一する

s/\x0D\x0A|\x0D|\x0A/\n/g;

改行コードを全て取り除く

s/\x0D\x0A|\x0D|\x0A//g;

改行コードを全て <BR> に変換する

 s/\x0D\x0A|\x0D|\x0A/<BR>/g;
カテゴリー
perl ファイル操作

flock()を使った強固な排他処理(ファイルロック)

perlで排他処理(ファイルロック)を行う場合様々な方法があります。

昔のレンタルサーバの場合はflock()が使えない環境などがあり、
symlinkやmkdirを使った処理が多くありました。

しかし、スピード・信頼性に優れていて、現代どこのサーバ(Unix系の)でも使えるであろうflockを使わない手はないと思います。

flockなんか壊れる、信頼しない…使い方は間違っていませんか?

まずは各ロック方式の特徴を

■ symlink
・遅い。
・ロックしたままの状態(ロック用シンボリックリンク)が残る可能性がある。
・サーバーによっては使えない場合がある。

■ mkdir
・遅い。
・ロックしたままの状態(ロック用ディレクトリ)が残る可能性がある。
・処理全体をロックする場合に便利。
・どの環境でも使用できる。

■ flock
・速い。
・アンロックし忘れが無い。

■サンプルソース
flockは完了するまで永遠と処理を待ち続けるため10秒のアラーム処理を入れ10秒以内に完了しなければタイムアウトとしました。
この処理は強力でまずファイルが壊れる事はありません。

このファイルロックを使い、10万PV/日でも壊れませんでした。
ただし、ロック処理の間に他のファイルを開く時にはファイルハンドル(サンプルでは"FILEHANDLE")を変える必要があります。

これを怠ると必ずファイルが壊れます。

#ロック処理開始
eval {
local $SIG{ALRM} = sub { die "timeout" };
alarm 10;#アラームを10秒に設定
#ログ読み込み&ロック
open(FILEHANDLE,"+<"); #読み書きモードでファイルオープン
flock(FILEHANDLE, 2);  #ロック確認 ロック
@data = <FILEHANDLE>; #@dataに読み込み
alarm 0;
};
alarm 0;#アラーム解除
if($@) {&error;}; # タイムアウト時の処理 別にsub errorが必要になる

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#  ここにロック中に行う処理
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

seek(FILEHANDLE, 0, 0);  # ファイルポインタを先頭にセット
print FILEHANDLE @data;  # ファイルに書き込む
truncate(FILEHANDLE, tell(FILEHANDLE));  # ファイルサイズを書き込んだサイズにする
close (FILEHANDLE);  #closeで自動にロック解除