MOD_REWRITE

LASTUPDATE 2004年07月28日

mod_rewrite とはapacheで用いられる モジュール の一種である。
モジュールとはapacheの機能を拡張するものであり、初期状態のapacheには複数のモジュールが初期状態で追加されている。今回の題材である mod_rewrite は Vine Linux 2.5(2.6) に付随しているRPMパッケージ版 apache 1.3系 には標準で含まれていた。

  本題に入ろう。mod_rewrite とは一体何者なのだろうか? 安易な例で申し訳ないのだが、直感的に理解して貰う為に次の例を述べる。
 
 ex )

 http://hoge.hoge/main/index.php?id=389834
 というURLをもつページにアクセス可能であるとして。(ページ1とする)
 
 http://hoge.hoge/389834 や http://389834.hoge.hoge/
 というURLへのアクセスで、前記のページ1を表示させたい場合(何故ならば大抵は短いURLの方が喜ばれるから)貴方はどのようにするのだろうか? このような問題に直面した時の1つの解答として mod_rewrite が存在する。

 mod_rewrite は貴方が記述した書式に一致するアクセス(ex http://hoge.hoge/続いた数値 という条件) を貴方が求めているURL(http://hoge.hoge/main/index.php?id=続いた数値 ) に書き直し(rewrite)てくれる。


 
□ インストールの手順や apache のDSOについて。又は apache 2.0 系における動作等は一切考慮していない。貴方の環境で mod_rewrite を実行できるかをチェックする為には fgrep LoadModule httpd.conf | fgrep rewrite_module あたりを実行してみてもらいたい。 httpd.conf が何処にあるのかが分からなければ locate httpd.conf や find / -name \*.conf -print あたりを実行してみてはどうだろうか。

□ また、無料(有料)のレンタルサーバを利用している場合、大抵は httpd.conf を編集できないが .htaccessファイル に記述する事によって mod_rewrite を利用する事ができるかもしれない。詳しくは管理者に問い合わせる事。

□ (間違いの指摘は lange@style.ne.jp まで御願いします)

□ メモ一覧
 目次

 + mod_rewrite の記述(httpd.conf or .htaccess)
 + 外部からの直接リンクを(直リンク)を防ぐ。
 + 外部からの直接リンクを(直リンク)を防ぐ(画像)。
 + アクセスしたディレクトリを違う場所に書き直す。
 + サブドメインアクセスを適切なURLに書き直す。



 + mod_rewrite の記述(httpd.conf or .htaccess)
   利用に先立って RewriteEngine On を使う。詳しい説明はココでご覧頂く事にして大抵使われるであろう
   RewriteRule と RewriteCond を説明してみる。

   RewriteRule 実際の書換を担当します。(途中)


 + 外部からの直接リンクを(直リンク)を防ぐ。
   例: http://hoge.hoge/test/ に対する直リンクを防ぐ。(ドキュメントルートが /home/htdocs の場合)
      http://hoge.hoge/ からのアクセスのみを許可する。

   <Directory /home/htdocs/test>
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^http://hoge\.hoge/.*$ [NC]
    RewriteRule ^(.*)$ - [F]
   </Directory>

   .htaccess の場合は /home/htdocs/test にファイルを置けば終わり。


 + 外部からの直接リンクを(直リンク)を防ぐ(画像)。
   例: http://hoge.hoge/test/ の画像に関して直リンクを防ぐ。

   <Directory /home/htdocs/test>
    <Files ~ "\.(gif|jpe?g|png)$">
     RewriteEngine On
     RewriteCond %{HTTP_REFERER} !^http://hoge\.hoge/.*$ [NC]
     RewriteRule ^(.*)$ - [F]
    </Files>
   </Directory>

   もしくは RewriteEngine で全てをすませたいなら(画像指定を Files でしない)
   
   RewriteEngine On
   RewriteCond %{REQUEST_URI} ^(.*)\.(gif|png|jpe[|g])$ [NC]
   RewriteCond %{HTTP_REFERER} !^http://hoge\.hoge/.*$ [NC]
   RewriteRule ^(.*)$ - [F]

   てな感じかな(動作未確認(汗))


 + アクセスしたディレクトリを違う場所に書き直す。
   例: http://hoge.hoge/abc のアクセスを http://hoge.hoge/def にする。
   RewriteEngine On
   RewriteRule ^/abc ^/def [R]


 + サブドメインアクセスを適切なURLに書き直す。

   例: http://lange.style.ne.jp のアクセスを http://www.style.ne.jp/in.php?no=lange にする。
   ( httpd.conf or .htaccess )
   バーチャルホストで定義する
   <VirtualHost xxx.xxx.xxx.xxx>
   ServerName style.ne.jp
   ServerAlias *.style.ne.jp
   ServerAdmin info@style.ne.jp
   RewriteEngine On
   RewriteCond %{HTTP_HOST} ([^\.]+).*
   RewriteRule ^/$ /in.php?no=%1 [R]
   </VirtualHost>























こっそり観やすく作り直し。