$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フィールドはドキュメントルートからのパスを指定します。従って
/
から始まります。/~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]
が省略されたと見なされます)。
次の制約を守ってください。
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つの行だけでループに陥る表現)だけが許されます。