UbuntuサーバのApache2でURLリライトを試してみる
ディストリビューション、OSの情報を取得する
セキュリティの本のテスト環境として付録CD-ROMに入っていたVMwareの仮想OSでURLリライトを有効にしてみる。
まず、ディストリビューション、Apacheのバージョンを確認してみた。
root@aaaa:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 10.04.1 LTS Release: 10.04 Codename: lucid root@aaaa:~# uname -a Linux aaaa 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux root@aaaa:~# apache2ctl -v Server version: Apache/2.2.14 (Ubuntu) Server built: Apr 13 2010 19:28:27 root@aaaa:~#
ディストリビューションはUnbuntu 10.04.1だった。
lsb_release のLSBとは "Linux Standard Base" の略で、多くのディストリビューションはこのLSBに準拠している。準拠していれば lsb_release コマンドでディストリビューションの情報を取得できる。
"uname -a" の2つ目の項目はホスト名。
apache2ctl はApacheのバージョンを調べたりできる。-M オプションでロードされているモジュールを列挙する。
mod_rewriteを有効にする
Apache2の設定ファイルは /etc/apache2 以下にあって、大本の設定ファイルは apache2.conf。このファイルからさらにいろんな設定ファイルがインクルードされている(参考3,4)。
サーバ管理者が設定を追加する場合は httpd.conf に書き加える。初期状態で httpd.conf は空である。apache2.conf や他の設定ファイルは基本的には触らないらしい。
デフォルトではURLリライトのモジュールmod_rewriteは有効になっていない。
mode_rewrite を有効にするには設定ファイルを手で編集するのではなく、以下のコマンドを使用する(参考5)。このコマンドの名前は "Apache2 enable module" ということかな。
sudo a2enmod rewrite
すると /etc/apache2/mods-available ディレクトリに rewrite.load が作成され、/etc/apace2/mods-enabled ディレクトリに rewrite.load へのリンクである rewrite.conf が作成される。
そしてサーバを再起動。以下のコマンドを実行。
sudo /etc/init.d/apache2 restart
URL書き換えルールの記述
URLリライトの書き換えルールはApache2の設定ファイルか、URLの書き換えをしたいディレクトリの .htaccess に書き換えルールを記述する。
<ドキュメントルート>/test/rewrite に下記の内容の .htaccess を作った。
RewriteEngine ON RewriteBase /test/rewrite RewriteRule ^index.html$|^$ top.html [L] RewriteRule ^y.*$ http://www.yahoo.co.jp/ [R,L] RewriteCond %{HTTP_USER_AGENT} MSIE RewriteRule ^.+$ ie.html [L]
実際の運用は想定しておらず、単に試してみようと思っただけ。以下のような書き換えを期待した。
書き換え前 | 書き換え後 | 備考 | |
---|---|---|---|
1 | /test/rewrite/index.html | /test/rewrite/top.html | |
2 | /test/rewrite/ | /test/rewrite/top.html | |
3 | /test/rewrite/y.* | http://www.yahoo.co.jp/ | 301リダイレクト |
4 | IEの場合 | /test/rewrite/ie.html | 1,2,3以外でIEの場合 |
しかし、実際にはIEで1,2の書き換え前にアクセスすると想定通りにはならず、4の書き換え後の ie.html が表示される。3の書き換え前にアクセスした場合は想定どおりyahooにリダイレクトされる。
ググって調べたところ、.htaccess や apache2 設定ファイルの "<Directory>" 内にURLリライトのルールを書いた場合、書き換えられたURLはさらに頭から書き換えルールを適用されてループするそうだ(参考12)。ループが止まるのは書き換えの必要がなくなるか、ループ回数の上限に達してエラーになるまで。
よって、1,2の場合では想定どおり1,2のルールで top.html に書き換えられる(1回目)。その後にまた頭から書き換えルールが適用されて4のルールで ie.html に書き換えられる(2回目)。そしてまたさらに頭から書き換えルールが適用されて、今度はマッチするものがないのでそこでURLリライトは終了する(3回目)。
3のルールは1度適用されると外部サイトに転送されるのでそこでURLリライトは終わり、想定どおりの結果となる。
うーん。"[L]" でURLリライトのループは防げるもんだと思ってたんだが、"[L]" は1つの設定の中でマッチしたらそれ以降は無視という意味で、書き換えルール全体を再適用することには関係ないようだ。難しい。
以下のように修正したら、想定どおりに動いてくれた(参考13)。4行目の内容を追加した。
'-' は置換禁止を意味する。これでなんでループが止まるのか良くわからないが。
RewriteEngine on RewriteBase /test/rewrite/ RewriteRule ^top.html - [L] RewriteRule ^index.html$|^$ top.html [L] RewriteRule ^y.*$ http://www.yahoo.co.jp/ [R,L] RewriteCond %{HTTP_USER_AGENT} MSIE RewriteRule ^.+$ ie.html [L]
RewriteLogの設定
前記のように最初はURLリライトが想定どおりに動かなかった。そこで、調査のためにURLリライトのログを出力するようにした。
RewriteLog,RewriteLogLevel を設定に追加するのだが、mod_rewriteのリファレンスを見ると
- RewriteCond,RewriteRule などのContext:server config, virtual host, directory, .htaccess
- RewriteLog,RewriteLogLevel のContext:server config, virtual host
とある。.htaccess に書いても動かない。
編集するファイルは /etc/apache2/httpd.conf である。内容は以下。
RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3
RewriteLogLevel の後ろの数字が大きいほど詳細なログを吐くが、実際2とか3で十分らしい。
また、パフォーマンスが悪化するのでテストの時以外は基本はURLリライトのログ出力は止めるべきである。
ftpサーバのインストール
VMware上のUbuntuサーバとWindowsとの間でファイルをやりとりするためにFTPサーバをインストールした。
起動/停止は以下のコマンド。<コマンド>は start/stop。
service vsftpd <コマンド>
参考サイト:
・lsb_release,unameについて
1.超初心者がubuntuでWebサーバーを作る
2.unameコマンド|Linuxコマンド
・UbuntuサーバのApache2について
3.超初心者がubuntuでWebサーバーを作る
4.Apache 2.2 設定 Ubuntu Server: IT備忘録
5.Apache2 mod_rewrite と AllowOverride | マキシマ文庫
・mod_rewriteのリファレンス
mod_rewrite - Apache HTTP Server
・URLリライトの設定について
6..htaccessのRewriteCond、RewriteRule:超初心者向けメモ|ぼくんちのバックステージ
7.Apache : mod_rewriteリファレンス - dawgsdk.org
8.mod_rewriteの考え方。 - こせきの技術日記
9.Apache module mod_rewrite
10.Apache Rewrite 設定のサンプル(1) : 個別のURLを転送する | OSCALOG
11.ApacheウェブサーバーのRewrite設定で使える正規表現サンプル集 | Web担当者Forum
12..htaccess ファイルで mod_rewrite の設定をする時の注意点 | ミヤビッチの穴
13., mod_rewriteによるURLの書換えに関するメモ - 忘れたときに備えた記録(2007-07-18)
14.ユーザーエージェントを利用したデバイスの振り分け[Apache,mod_rewrite,.htaccess] | yama-log
15.【apache】mod_rewriteの設定について|My ProjectWEB
16.mod_rewriteの[L]フラグの挙動がよくわかりません。 下記のよう.. - 人力検索はてな
・ftpサーバについて
17.Ubuntu 10.04 LTS - FTPサーバー - Vsftpd インストール : Server World
18.[ubuntu][さくらVPS]vsFtpdインストール | ino Hanging Around
« WEBページのタイトルとURLを一発コピーするFirefoxのアドオン | Main | 釣り番組まとめ »
「プログラミング、技術情報」カテゴリの記事
- PHPStorm 2018.1.7 に更新(2018.12.09)
- 技術メモをQiitaに移行(2016.01.24)
- 正規表現メモ:ものぐさ(最小)マッチング(2015.11.29)
- BASE64にエンコード/デコードするバッチファイル(2015.11.23)
- Windows7の検索ボックスの検索条件指定(フォルダの除外など)(2015.08.16)
「Linux」カテゴリの記事
- CakePHPのインストール(2015.06.14)
- PHPからPDOでPostgreSQLに接続する(2015.06.09)
- Laravel4のインストール(2015.05.06)
- URLリライトの復習その2(2015.04.07)
- composerのインストール(2015.04.01)
The comments to this entry are closed.
Comments