ある日サーバーの乗り換えを実施したところ、一部の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 件のコメント:
コメントを投稿