そのまま使えるmodRewriteの技10発

引っ越ししました!
新しいサイトはこちら

ディレクターズラボ



modRewiteはURL操作で最強のツールです。
数年前、これの存在を知ったときはWEB関連の技術の中で一番の衝撃を受けました。
modRewriteの小技をまとめてあるサイトが無かったので、まとめの為のエントリーです。

modRewiteとは

Apacheのモジュールの一つ
・URLを書き換えられる(リダイレクト)
・一般的には.htaccessに書いて使う

modRewiteで何ができるか

・携帯サイトの振り分けができる
・動的ページを静的ページに見せることができる(SEO対策)
・サイトの引越し(リニューアル)の時に一度にリダイレクトができる。
・外部からの直リンクを防ぐ(ページ)
・外部からの直リンクを防ぐ(画像)
等、考えれば他にも色々あるかもしれません。

modRewiteの設置方法

一般的には、.htaccessの中に記述します。.htaccessの書き方については別のサイトを参照してください。
まずは、.htaccessの中に

Options FollowSymLinks
RewriteEngine On

の2行を書きます。FollowSymLinksに関しては必要ないサーバーもありますが、書いていても害は無いはず。

実際に使ってみよう

■技1発目 携帯サイトの振り分けを行う

携帯サイトを作るときは、ディレクトリ [i] [e] [s]などを作って、そこにファイルを設置し、
http://www.hogehoge.com/i/
などとしてアクセスしますが、下記の記述でhttp://www.hogehoge.com/でアクセスしたら自動的にリダイレクトすることができます。
少し考えると、ちょっと悪いこともできちゃいます。

ファイル.htaccess
設置場所http://www.hogehoge.com/のドキュメントルート

Options FollowSymLinks
RewriteEngine On 

RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteRule ^$ http://www.hogehoge.com/i/ [R]
RewriteCond %{HTTP_USER_AGENT} SoftBank
RewriteRule ^$ http://www.hogehoge.com/s/ [R]
RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteRule ^$ http://www.hogehoge.com/e/ [R]


■技2発目 動的ページを静的ページに見せる
modRewriteはSEO対策で有名になりました。
動的ページを静的に見せ、検索エンジンにインデックスされやすくします。

例)

http://www.hogehoge.com/search.php?type=a&id=123
 ↓
http://www.hogehoge.com/a_123.html

ファイル: .htaccess
設置場所: URLを書き換えたいディレクト

Options FollowSymLinks
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9A-Za-z]+)_([0-9A-Za-z]+).html$ search.php?type=$1&id=$2

すこし、ぐちゃぐちゃしてます、
[a_123.html]の部分が ^([0-9A-Za-z]+)_([0-9A-Za-z]+).html$になります。アンダースコア(_)区切り文字になっています。
[0-9A-Za-z]は、数字またはアルファベット(大文字/小文字含む)を表しています。
その後ろのプラス(+)が、1文字以上という意味です。そしてそれを丸括弧()で囲むことで、後方の$1$2に渡しています。
詳しくは、マニュアルを読むのが良いと思いますが、正規表現という書き方です。


■技3発目 サイトの引越し(リニューアル)の時に一度にリダイレクト。

例えば、http://www.hoge.com/http://www.fuge.com/ というように、ドメインが変わったとします。
その際、http://www.hoge.com/のどのファイル/ディレクトリにアクセスされても、http://www.fuge.com/に転送させることができます。
と、言っても実はコレ、機能的には.htaccessでもできてしまうのですが、modRewriteを使うメリットとしては検索エンジン対策にもなります。
ステータスコード301を返すことによって、検索エンジンの評価(有名なのはGooglePageRank)をそのまま引き継ぐことができます。

ファイル: .htaccess
設置場所: http://www.hoge.com/のドキュメントルート

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


■技4発目 外部からの直リンクを防ぐ(ページ)

あるページへ、直接リンクされたくない場合、下記のようにすることでページへの直リンクを防ぐことができます。
下記はドキュメントルートが、/public_htmlで、http://www.hoge.com/test/に直リンクされたくない場合です。

ファイル: .htaccess
設置場所: http://www.hoge.com/のドキュメントルート

<Directory /public_html/test>
	Options FollowSymLinks
	RewriteEngine On

	RewriteCond %{HTTP_REFERER} !^http://www.hoge\.com/.*$ [NC]
	RewriteRule ^(.*)$ - [F]
</Directory>


■技5発目 外部からの直リンクを防ぐ(画像)

画像への直リンクは特に要望が多いと思います。
下記のようにすれば、直リンクを防ぐことが可能です。

ファイル: .htaccess
設置場所: http://www.hoge.com/のドキュメントルート

Options FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} ^(.*)\.(gif|png|jpg)$ [NC]
RewriteCond %{HTTP_REFERER} !^http://hoge\.com/.*$ [NC]
RewriteRule ^(.*)$ - [F]


今回は、ここまで。
長くなりすぎた&実はすぐに10個も技が思いつかなかったので近いうちにまたエントリーします。

プログラマじゃなくても3キャリア+PC絵文字対応が出来るセット

予告どおり、今回のエントリーは絵文字の3キャリア対応について。
少し前、PHPのライブラリで絵文字ライブラリの
MobilePictogramConverter(http://php-develop.org/MobilePictogramConverter/)が
話題になりましたが、とても良いライブラリでした。

で、使ってみる実験のついでに、プログラマじゃなくても使えないかと思って、フィルタを作ってみました。

ダウンロード

簡単絵文字変換セット:http://www.srce.jp/archive/emoji_conv_set.zip(606KB)
設置が面倒な為、上記のMobilePictogramConverterとSmartyを同梱させてもらいました。

設置条件

1、PHPが使えるサーバーである。
2、.htaccessが利用可能なサーバーである。(modRewriteを使っています)
の2点が必須です。
modRewriteは共用サーバーの場合、使えないことがあるかもしれません。

セットアップ

ダウンロードしたZIPファイルを展開すると、ファイル郡が出てきますので、それをFTPでアップロードします。
その後、[templates_c]のパーミッションを707もしくは777にして下さい。


終わったら、http://[設置したディレクトリ]/test.htmlにアクセス。
「絵文字テストファイル」というタイトルのページが表示され、絵文字が出ていれば成功です。

実際に使う

新しくファイルを作る(元からあるファイルを変換する)場合は、[templates]の中に、ファイルを設置してください。
このフィルタは、i-mode用の絵文字をベースにしていますので、記述はi-modeのS-JIS10進数を使って記述します。(絵文字コードhttp://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/

ちょっと技術情報

このフィルタは、絵文字変換ライブラリ+Smarty+modRewriteで作りました。

処理の流れは下記の通りです。

1 ユーザーが、http://hogehoge.com/test.htmlにアクセス
2 modRewriteが、/test.htmlへのアクセスを/index.php?page=testに変換
3 index.phpSmartyクラスを呼び出し、/templates/test.htmlをコンパイル
4 表示するときにOutputフィルタ(lib/smarty/plugins/outputfilter.convEmojiFilter.php)を使い、ファイル内全てのi-mode用絵文字コードを各キャリア用に変換(3キャリア以外の場合は画像を表示)

となっています。
毎回ファイル内の全ての絵文字コードを変換するため、効率は悪いですが、手軽さを第一で考えました。

ご意見、ご指摘、誹謗、中傷などありましたら、お気軽にどうぞ。

最速のWEBサイト移行方法

WEBサイトの制作会社で働いていると、意外と多いのがクライアントのサーバー移行。

これがまた、とにかくめんどくさい。
今のサーバーのデータを全部FTPでダウンロードして、新しいサーバーにアップロード。
その後、CGIとかある場合は全部のフォルダを一つずつ開きながらパーミッションの設定をして・・・
ファイル数が数百程度で少なければ問題ないが、数千単位になるとDL/UPの作業だけで丸一日かかる。


そんな面倒なサイト移行を一瞬で終わらせる方法がある。

UNIXコマンドを使う必要があるので、SSH、もしくはTelnet(今は許可してるサーバーほとんど無いけど)が接続可能な場合による。もし、移行元、移行先のサーバーで使えない場合は、次回のエントリーで書く予定のツールを使ってみて欲しい。

移行元をA、移行先をBとする。
1 AサーバーにSSHで接続。
2 ドキュメントルートディレクトリ(public_html等)に対して下記のコマンドで圧縮を掛けpublic.tar.gzというファイルを作る。
 # tar zcvfp www.tar.gz public_html/
3 http経由で閲覧可能なディレクトリに移動。
 # mv public.tar.gz public_html/


4 BサーバーにSSHで接続。
5 BサーバーのドキュメントルートがあるディレクトリでAサーバーにおいた、public.tar.gzを取得する。
 # wget http://www.hogehoge.com/public.tar.gz
6 圧縮されたファイルを解凍する。
 # tar zxvf public.tar.gz
7 mvコマンドなどを使って、新しいサーバーのドキュメントルートと入れ替える。
8 所有者情報を一括で変更する。
 # chown -R [自分の名前] public_html/

おしまい

サーバー間の回線は、一般回線よりも太い回線が多い上、ファイルを1つに圧縮しているので、とにかく速い。
なおかつ、圧縮時に-pコマンドを追加しているので、パーミッション等の属性も保持したまま移行が出来る。
ファイル数やファイルサイズ、回線にもよるが、一般的なサイトであれば数分で終わると思う。

注意点としては
・移行元のサーバーの容量を確認する(圧縮は、コピー圧縮なので最大2倍の容量が必要になる場合もある)

 
と、まあとにかく楽な移行方法なのだが、一般的な共用レンタルサーバーの場合SSHが使えない事も多い。
そういう時に使えるツールがある。
次回のエントリーでご紹介。

はじめまして。

アキラと申します。
福岡は博多でWEB制作をやっている会社
ソースクリエイト(http://www.srce.jp/)で働いています。

システムクリエイターという肩書きで仕事をしてますが、正直な所、生粋のプログラマでもありません。
が、プログラムを書いている年数は比較的長く、もうそろそろ十年になろうかと。

Perlが好きです。どうかいても動く適当さや、意外な裏技や、すばらしいモジュールも。
この日記で、その辺りの事も書いていく予定です。
テーマは、システム系のモノが多くなると思います。

よろしくお願いします。