2010年12月15日水曜日

Redirectディレクティブのパラメータの形式

ある日サーバーの乗り換えを実施したところ、一部のURLで404エラーが発生するようになってしまった。

原因は、乗り換え前のサーバーとApacheのバージョンが変わってしまってリダイレクトが効かなくなったため。根本的には、 .htaccess 内のRedirectディレクティブで形式エラーが発生したためであった。

エラーのログ(apache の error_log)

[Fri Dec 10 20:18:06 2010] [alert] [client xxx.xxx.xxx.xxx] /foo/bar/baz/.htaccess: Redirect to non-URL, referer: http://example.com/index.html

.htaccess で Redirect to non-URL ですよ、と。

.htacces の修正

修正前
Redirect permanent /foo.html /foo/index.html

最後のパラメータ(リダイレクト先)がURLの形式になっていなかった。乗り換え前のサーバーではこれで問題なかったのだが…

修正後
Redirect permanent /foo.html http://example.com/foo/index.html

httpスキームとホスト名を追加してURLの形式にしたらOK。ホスト名を指定してしまうとWebサイトのテスト工程などで不便になるのだが、やむをえず。

Redirectディレクティブの仕様を調べてみる

ApacheのドキュメントからRedirectのSyntaxを引用:

Redirect [status] URL-path URL

リダイレクト元を表すURL-pathとリダイレクト先を表すURLの形式については、バージョン1.3, 2.0, 2.2 ごとに仕様記述が変化している(mod_alias は比較的素朴で安定したモジュールだと思われるが、それでも変化している)。仕様を読む限り、バージョン2.2からリダイレクト先の記述でスキームやホスト名を省略できることになったようだ。

Apache 1.3 の場合
パラメータ URL-path, URL の形式については特に記述が無い。
Apache 2.0 の場合
URL について、「スキームとホスト名で始まる完全なURLであるべし」と記述されている。
The new URL should be an absolute URL beginning with a scheme and hostname
この文で、"an absolute URL" という英語に「絶対URL」という用語をあてる人もいるが、混乱を招くようだ。"absolute"は"complete"でもあるから「完全なURL」としておいたほうが適切と思われる。
Apache 2.2 の場合
URL について、さらに「しかし、スラッシュで始まるURL-pathも使用できる。その場合は現在のサーバーのスキームとホスト名が付加される」と追記されている。
, but a URL-path beginning with a slash may also be used, in which case the scheme and hostname of the current server will be added.

この文で"URL-path"の書体はイタリックではない。よって一般的な用語としての"URL-path"であり、SyntaxにおけるURL-pathではないと思われる。

0 件のコメント:

コメントを投稿