URI 変換 (2)
目次
配置
$web/etc/rewrite
説明
このファイルは/sys/lib/httpd.rewrite
と共に Pegasus にアクセスするクライアントからのリクエストに対して正しい URI を知らせるために使用されます。
URI 変換は2つの段階で行われます。まず最初に /sys/lib/httpd.rewrite
によって(このファイルはサーバ管理者によって管理されます)、その次に $web/etc/rewrite
によって(このファイルはドキュメントの管理者によって管理されます) URI が変換され、その内容がクライアントに伝えられます。($web
は web ルートです。)
$web/etc/rewrite
の変換規則は次の通りです。
第1フィールドはドキュメントルートからのパスを指定します。従って
- 第1フィールドは必ず
/
から始まります。
- 第1フィールドに
/~alice
のようにユーザを指定できません。
*
修飾子が使用できません。第2フィールドで指定できるリダイレクションの形式は、以下の2つのうちのいずれかです。scheme://hostdom[:port][/path][;params][?query]
/path[;params][?query]
[ ]
は省略可能であることを表すメタ記号で、scheme ::
任意のスキーム
hostdom ::
ホストの完全名 (pegasus.goodwill.com
など)
port ::
ポート番号
path ::
ドキュメントへのパス
params ::
CGI に渡す引数リスト
query :: query
文字列
/
で始まる場合には、第1フィールドにマッチすることによって受け入れられた scheme://host[:port]
が省略されたと見なされます)。マッチしたパスはパターンと一致した部分が第2フィールドで置き換えられます。(パスのマッチング規則に関しては パス名適合規則を参照して下さい。)
次の制約を守ってください。
scheme
とhost
は小文字で書いてください
port
は80
と443
については省いてください
パス名のマッチング
httpd.rewrite
で使用されているパス名の適合規則は単なる部分文字列を見ているわれではありません。ディレクトリの区切りをみています。
リダイレクションループ
/sys/lib/httpd.rewrite
のケーススタディの中に現れた次の例について考えてみましょう。/private https://pegasus.goodwill.com/private
bob
がこのように書く気持ちは、 http
を使用したリクエストを秘密性を要するデータに適用するのを嫌い、この処理を暗号通信を使用する https
を使って行うようにクライアントに指示しているのです。しかしこれを機械的にリダイレクションすると、https://pegasus.goodwill.com/private
でアクセスしたクライアントはリダイレクションの無限ループに陥ります!bob
の気持ちを尊重するとすれば(尊重しなくてはなりません。なぜなら誰でもこのように書きたくなるでしょう。) この場合にはサーバはリダイレクションしてはなりません。単に受け入れるべきです。Pegasus はそのように設計されています。リダイレクションループの表現は
$web/etc/rewrite
でのみ許され /sys/lib/httpd.rewrite
では許されません。また単純形(1つの行だけでループに陥る表現)だけが許されます。