takeshi
2008/09/09

mod_rewriteの使い方

ある特定のディレクトリやファイルに対して
動的URL(クエリ―式)でアクセスがあった場合は
mod_rewriteを使って静的URL(path info式)で処理されるようにする。

例えば以下のような記述を
httpd.confなどに記述する。
htaccessに記述する場合は前回同様
若干仕様が異なるので注意。
特にログの設定や、マップの指定をhtaccessにすると
エラーが起こるようです。

Code:

#リライトエンジンの開始
RewriteEngine On
#ログの指定
RewriteLog "/var/log/httpd/hoge-rewrite.log"
#ログの出力レベル(大きくするほど重くなります)
RewriteLogLevel 9
#マップの設定
RewriteMap hoge txt:/usr/local/etc/apache22/map.txt
 
#ルールの設定
RewriteRule ^/test/([^/]+)$ /test/index.php?key=${hoge:$1} [L]

この場合、http://myhostname.com/test/ほげ
などの日本語を含むURLにもマッチします。
そしてそれを/test/index.phpにアクセスされたものとして処理をします。
このときにhttp://myhostname/test/ほげ/index.php?hoge=1111&piyo=piyotarou
などのパラメータは%{QUERY_STRING}に変数として格納され
/test/index.phpにくっついていきます。
そして最後に[L]というフラグをくっつけます。
このフラグはこのルールが適用されたら、それ以降のルールの適用をストップするという意味があります。
これがないと、これ以降に記述されたルールに次々と適用するかどうかの処理が続いてしまうので注意です。

応用編

getでパラメータを投げる場合、URLは必ず

http://myhost/index.php?name=ぴよ

のように動的なURLになってしまいます。
これをmod_rewriteのリダイレクト機能を使ってURLを書き変えたいのですが
くっついてくるパラメータによってリダイレクト先を変えたい場合には
mod_rewriteのリダイレクト機能だけでは不十分です。
(僕はそのように感じただけで、他に何かやり方があるかもしれませんのでご注意を。)

例えばフォームで投稿したときのURLを

http://myhost/ぴよ/index.php

のようにしたい場合に当てはまります。
ルールを以下のようにします。

Code:

RewriteRule ^/test/index.php$ /test/controller.php?%{QUERY_STRING} [L]
RewriteRule ^/test/([^/]+)/index.php$ /test/index.php?name=$1 [L]

フォームを投稿したときブラウザはまず
http://myhost/index.php?name=ぴよ
とリクエストします。
すると、一つ目のルールに引っ掛かります。
(なおパターン的には二つ目のルールにもマッチしますが、[L]フラグが立っているので
二つ目のルールは無視されます)

一つ目のルールによってcontroller.phpにパラメータ付で処理をします。
controller.phpはQUERY_STRINGを分析して新しいURLを組みなおして
header()で二つ目のルールに当てはまるようなURLに飛ばします。
例えば

/test/ぴよ/index.php

と指定します。

そうすると二つ目のルールにマッチし、
/test/index.php?name=ぴよ
と解釈されます。

これで、ブラウザのURLは
/test/ぴよひこ/index.php
と表示されたままになります。

モバイルのサイトを作るときに、PCなどの端末からのアクセスをブロックする
あるいは別のページに飛ばすことが必要になることがあると思います。
mod_rewriteを使えば、ユーザーエージェントを使いまわせるので、
phpなどですべてのページにユーザーエージェントの選り分け処理を書く手間が省けます。

以下はhttpd.confのvirtualhostディレクティブの中に書いたものです。
なおhtaccessに書く場合は若干書き方が変わるので注意してください。

Code:

RewriteEngine On#rewrite engineの初期化
RewriteLog "/var/log/httpd/yourdomain.log"#logの書き出し
RewriteLogLevel 3#logの書きだしレベル(0-9の間)
 
#以下ケータイ端末のユーザーエージェントをANDで連結する
RewriteCond %{HTTP_USER_AGENT} !^DoCoMo     [NC]
RewriteCond %{HTTP_USER_AGENT} !^KDDI       [NC]
RewriteCond %{HTTP_USER_AGENT} !^Up.Browser [NC]
RewriteCond %{HTTP_USER_AGENT} !^J-PHONE    [NC]
RewriteCond %{HTTP_USER_AGENT} !^vodafone   [NC]
RewriteCond %{HTTP_USER_AGENT} !^SoftBank   [NC]
RewriteCond %{HTTP_USER_AGENT} !^MOT-   [NC]
RewriteCond %{HTTP_USER_AGENT} !^Semulator   [NC]
RewriteCond %{HTTP_USER_AGENT} !^Nokia   [NC]
RewriteCond %{HTTP_USER_AGENT} !^Y\!J   [NC]
 
#上記以外のユーザーエージェントがアクセスした場合は別ファイルに飛ばす
RewriteRule ^/(.+)$ /disable.php [L]

注意すべきはひとつのルールに対して条件を設定していくので
複数のルールにたいしても共通の条件を設定したい場合は
ルールの数だけ同じ条件を書かなければいけないということです。
これにはだいぶハマった・・・。

なお現在の検索エンジンのクローラーのユーザーエージェントは
ドコモやソフトバンク、AU、またはNOKIAのユーザーエージェントを
偽装(実装?)してアクセスしてくるので問題ないと思われます。

Joomlaをインストールしています。

ちなみに使っている環境はWindows XP Home Editionに
Vmware Serverを入れて
そこにFreeBSDをつっこんでいます。
もちろんphp5, apache, mysqlです。

Joomla!インストール方法

  1. Joomla 1.5をダウンロード
  2. サーバーに展開
  3. Joomlaを格納したディレクトリにブラウザでアクセス
  4. インストール画面が立ち上がるので、画面に従って進む。
  5. 途中で、configuration.php-distに実行権限を付与
  6. 完了

サンプルデータのインストールで起こったエラー
途中でこんなエラー文がでてきました。
Error: the XML response that was returned from the server is invalid.
configrationファイルにきちんと書き込めないのでデータベースにアクセスできないと解釈しました。
何十分か奮闘していると、JoomlaのBBSにこんな書き込みを見つけました。

Do not do this: mv configuration.php-dist configuration.php

そこでconfiguration.php-distを見てみると

Code:

mv configuration.php-dist configuration.php

とあるのでそれに従うと、管理画面がこのファイルに書き込みができなくなってしまうようです。
これは以前のバージョンと仕様が違っているのかもしれませんね。
なのでファイル名はconfiguration.php-distのままインストールをしたほうが良いようです。

参考スレッド:
http://forum.joomla.org/viewtopic.php?f=429&t=265877#p1211077

takeshi
2008/08/26

mysql: max_allowed_packet

mysqlimportをしようとしたらエラー文が表示される。
どうやら設定されたmax_allowed_packetよりもデータが大きいらしい。
そこで以下の対策をとる

Code:

cp /usr/local/share/mysql/my-huge.cnf /etc/my.cnf
vim /etc/my.cnf

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 16M #←ココを増やす

Code:

/usr/local/etc/rc.d/mysql-server restart
mysql --help

max_allowed_packetが増えているのを確認する

takeshi
2008/04/30

ブログはじめました!

四月から働き始めてちょうど一ヶ月が経ちます。
一ヶ月の間に、新しく覚えたことがたくさんあって
それを残しておくためにもこのブログを作りました。

もしかしたら、誰かがこのブログを読んで
何かしらのヒントを得ることがそのうちあるかもしれないし、ないかもしれない。

これまでは、“Know The World”という別のブログをずっとやっていて、そこでは主に大学で勉強していたことや、日々感じること、写真や映画、音楽など、一般的なことを書いてきました。ところが、本格的に仕事が始まると、もっと専門的、技術的なことを書く必要がでてきたので、ブログをわけて書くことにしました。

僕は三年間、PHPプログラマーのアルバイトをしていました。大学院を今年の三月に卒業して、今の会社に新卒として入社しました。現在働いている会社は、ネットでサービスをしている会社で、僕はそこのエンジニア兼プログラマーとして働いています。

と、自己紹介はここまでにして、次回はグーグルなどでおなじみのサイトマップについて、ちょっとだけメモしたものがありますので、ちょこっと紹介したいと思います。

それでは、お付き合い、よろしくお願いいたします。

<< 1 2 3 4

はじめまして。Takeshiといいます。今年の四月から、恵比寿の小さな会社でウェブSE兼プログラマーとして働き始めました。主にLAMP環境でウェブサービスやウェブサイトの構築をやっています。社会人なりたてということもあり、右も左もわからない状況ですが、日々感じたことや、覚えたことなどをメモっていきたいと思います。コメントやトラックバックなどいただけると、とても嬉しいです!それでは、よろしくお願いいたします。

9月 2010
 << <   > >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

検索

XMLフィード

blog software