ARAGO for Internet Wiki Project AkuAku

This web site is powered by Arago for Internet v7.0 UTF-8 edition on FreeBSD
SPC main menu Expand/Fold
Products 取扱商品 Expand/Fold
SouthWind  Expand/Fold
Q&A Technical support Expand/Fold
BBS 掲示板 Expand/Fold
Easy PC life Expand/Fold

Last Edit Date: 06/07/2008
mod_rewriteについて

mo_rewriteはApaheの拡張機能です。 mod_rewriteで色々なことができます。 URLで渡された引数などを指定した形式に変換します。
virtualhostもmod_rewriteでも実現できます。 boodooだと言う人もいますので祭儀用の鶏が必要なのかもしれません。 何しろ下手をすると自分で読めなく可能性がありますので十分

注してください。
基本的な解説はhttp://httpd.apache.org/docs/2.2/rewrite/にあります。 もちろんApache2.2の話です。 旧バージョンのApacheやIISについては、Googleしてください。

現在 インターネットでどこかのサイトに行くのは検索エンジンで検索して、そこへ飛ぶのが一番多い方法だと思います。 そこでサイトのページがCGIで処理されるときに、CGIの処理プログラム名と引数となるのが一般的でしたが、検索エンジンでは、下手な引数を渡して実行すると、CGIが暴走したりしてサイトが落ちる危険があります。 そこで検索エンジンは、CGI+引数で生成されるページをアクセスしないのが一般的です。 一時世界的なサイトが検索エンジンでサイト情報を収集するときにCGI+引数を勝手に実行し随分と多くのサイトが落ちたようです。 その結果CGI+引数のページは検索エンジンでは表示されないということになります。

www.boodoo.com/cgi-bin/aragoi.exe?getanswer.prg という処理によってanswerというページを表示したいとすると、mod_rewriteを使うことで 

www.boodoo.com/answer.htmlとアクセスするとで、内部で指定することでwww.boodoo.com/cgi-bin/aragoi.exe?getanswer.prgのように変換し処理し

answer.htmlとして返すことできます。 もちろんURLでどれだけ複雑なことでもmod_rewriteで好きなように変換できます。 

つまりmod_rewriteを利用することでCGIを利用したサイトでもSearch Engine Friendly にするでことができます。

また例えばindex.htmlがなければ、index.prgを実行すると指定することができます。 mod_rewriteの表現は正規表現です。 何が"正規"なのかよく分からん代物ですが、regular expressionとしてくれたほうがすっきりするのだが???


SPCのサイトの移行作業はdocumentrootにindex.htmlがありました。 このindex.htmlは他にジャンプするようにしていました。
作業はwww.soupacific.com/akuaku/rewrite.prgでAkuakuのindex.htmlに相当するところに行き作業しました。
外からのアクセスはindex.htmlがあるのですから、rewrite.prgには行きません。
作業終了でindex.htmlを削除することでAkuakuに入ることができます。

どこのサイトも同じでしょうが、運用期間が長いところでは膨大な量のページがあると思います。 基本的な部分を移行してあとはページの編集画面で、別に開いたBrowserで必要なページに行き、その

画面をコピーして、編集画面のopenWYSIWYGにコピーすればリンク情報もすべてコピーされます。 保存して確認し、問題があれば編集してください。
もちろん既存のサイトがwww.boodoo.com/news/xxxx.htmlとなっていても、mod_rewriteで自由に処理することができます。



Apacheの設定 
httpd.confの具体的な変更追加部分
まずmoduleをloadできるように設定。
LoadModule rewrite_module libexec/apache21/mod_rewrite.so


ServerAdmin admin@soupacific.com
DocumentRoot /home/virtualdomains/soupacific.com/httpddocs/
ServerName www.soupacific.com
ErrorLog /var/log/soupacific.com-error_log
CustomLog /var/log/soupacific.com-access_log common
##cgi-binが二つある、Apacheでは、cgiディレクトリをいくつでも持つことができます!
##もちろんそれぞれのcgiディレクトリの設定を記述しなければ以下ません!
ScriptAlias /cgi-bin/ "/home/virtualdomains/soupacific.com/cgi-bin/"
ScriptAlias /akuaku/ "/home/virtualdomains/soupacific.com/akuaku/"
##virtualhostを指定する中でdebug用のログを吐き出す出すように指定します。 正常にサイトが運用できたのを確認してコメントアウトする。
## for debug rewrite
LogLevel Warn
logファイルの書き出し先指定
RewriteLog /var/log/rewritespc.log
logレベル 9は何でも書き出す
RewritelogLevel 9

AllowOverride None
Order Deny,Allow
Deny from all
Allow from all
##ここでwww.spc.comとアクセスされたときには次の行で処理する。
DirectoryIndex index.html /akuaku/rewrite.prg

#Rewrite current-style URLs of the form rewrite.prg + x
##rewriteエンジンを有効にし動作させる!
RewriteEngine on
##ここから具体的な指定
RewriteCond %{REQUEST_FILENAME} !-f  もし指定するファイルが無かったら。
RewriteCond %{REQEUST_FILENAME} !-d もし指定するディレクトリが無かったら。
RewriteRule ^(bulletin|cgihtm|marketing|products|sales|southwind|support|users|varusers|whatsnew)/(.*).html$ /akuaku/rewrite.prg?$1_$2[last]
***************************************************************************
^は条件の始まりを表す $は条件文の終端記号
(AAA|BBB|CCC)は AAAまたはBBBまたはCCCである 上記の例では/がその次にくるので、 AAA/ またはBBB/ またはCCC/というディレクトリ
でその下の(.*).html は指定するディレクトリの拡張子がhtmlであるすべてのファイルです。 この条件に一致したときには、/akuaku/にあるrewrite.prgに引数を渡して実行する。 

引数は、最初の引数として(AAA|BBB|CCC)のどれか、二番目の引数はhtmlファイルのファイル名です。 それを$1_$2とします。 AAAが最初の引数、2番目のファイル名がXXXだとすると、$1が AAA、 $2がXXXですので、 AAA_XXXとなります。 結果は/akuaku/rewrite.prg?AAA_XXXとなり、それを実行します。 [last]はこの条件の処理はこれでおしまいという意味です。 既存のサイトでwww.xxx.com/sales/uhavetobuy.htmlなどというのが有ったときに、その移行作業では、そのファイルを削除するまでは、rewrite.prgは起動されません。 試験するにはwww.xxx.com/sales_uhavetobuy.htmlで試験することができます。

RewriteCond %{REQUEST_FILENAME} !-f  もし指定するファイルが無かったら。
RewriteCond %{REQEUST_FILENAME} !-d もし指定するディレクトリが無かったら。

RewriteRule ^(.*)/(.*).html$ /akuaku/rewrite.prg?$1_$2[last]
新規にディレクトリを含むファイルを作成したとき、 www.aaa.com/tikitiki/hello.html と言うファイルを新規に作成すると、内部ではファイル名をtikitiki_helloとして扱います。 ページの作成で説明します。

##
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQEUST_FILENAME} !-d
次の三行はその後の一行で表現できます。
## RewriteRule ^en/(.*).html$ /akuaku/en/rewrite.prg?$1 [last]
## RewriteRule ^tch/(.*).html$ /akuakutch/rewrite.prg?$1 [last]
## RewriteRule ^sch/(.*).html$ /akuaku/sch/rewrite.prg?$1 [last]
RewriteRule ^(en|tch|sch)/(.*).html$ /akuaku/$1/rewrite.prg?$2 [last]
この部分では指定されたディレクトリのrewrite.prgを実行しています。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQEUST_FILENAME} !-d
RewriteRule ^(.*).html$ /akuaku/rewrite.prg?$1 [last]
上の行はURLでしていされるファイルが無くディレクトリも存在しなければ、 /akauaku/rewrite.prgの引数としてhtmlファイル名を渡し実行します。
ここでもしその指定するhtmlファイルが存在すると、そのhtmlファイルを返します。
##Rewrite end

次のcgiディレクトリcgi-binの指定

Options +ExecCGI
AllowOverride None
Order Deny,allow
## Deny from all
Allow from all

次のcgiディレクトリakuakuの指定

Options +ExecCGI
AllowOverride None
Order Deny,allow
## Deny from all
Allow from all



rewrite.prgの内容については後で説明します。 rewrite.prgのなかで外部からのrewrite.prgの直接起動を禁止することもできます。

複数のcgiディレクトリ
Apacheでは複数のcgiディレクトリを指定できます。 cgiディレクトリの数の制限について知りません。 しかしひとつのhtmlページにはFORMの指定はひとつしか書けません! 混乱しないでください。 移行作業で、過去のcgiをとりあえずそのまま残すときにはなかなか便利ですね。

mod_rewriteの詳しい解説はhttp://httpd.apache.org/docs/2.2/rewrite/ を参照ください。
Advertisement Expand/Fold