無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

HTTP host ヘッダの初実装は?

HTTP にて name based なバーチャルホストを実現するための Host ヘッダは RFC2068 (Hypertext Transfer Protocol - HTTP/1.1) にて定義されている。

RFC2068 は 1997/1 の発行であるが、web サーバ・ブラウザへの実装自体はもっと早い段階で行われている。

例えば、apache で Host ヘッダが利用可能になったのは apache-1.1 だが (New Features with Apache 1.1 を参照。正確には apache-1.1b1 か?)、apache-1.1 のリリース日は 1996/7/3 である。

で、わたしがずっと疑問に思っていたのは Host ヘッダは誰が提案し、誰が初めて実装したものかというもの。web サーバとブラウザが歩調を合わせないと意味がないため、NCSA httpd と NCSA Mosaic が初実装ではないかと想像していたのだが、どうやら NCSA httpd には IP アドレスベースなバーチャルホスト機能しか実装されていなかったようなので、違うらしい。

では、RFC を策定した IETF の、HTTP ワーキンググループにて提案され、HTTP/1.1 策定前に web サーバ・ブラウザ開発者が先取りして実装したのか?

というところで時間切れ。結局何もわからず。

スポンサーサイト

PageTop

SSL/TLS 必須ページの .htaccess 設定

http://example.jp/ は http だが、http://example.jp/security/ は SSL/TLS 必須と
する場合の .htaccess 設定。

方法1. バーチャルホスト (VirtualHost ディレクティブ) を別に切る
 これが一番スマートかも。それができない場合は方法2 や方法3 で対応。

方法2. SSLRequireSSL を使う。
 .htaccess に
  SSLRequireSSL
 と書くだけで、そのディレクトリ以下は SSL 必須となる (SSL 以外のアクセスは deny する)。
 httpd.conf に記述するなら
  <Directory "/foo/bar">
   SSLRequireSSL
  </Directory>
 とする。
  マニュアル: http://httpd.apache.org/docs/2.0/ja/mod/mod_ssl.html#SSLRequireSSL

方法3. RewiteCond で判別し、http(80) の場合は他に飛ばす。
 RewriteEngine on
 RewriteCond %{SERVER_PORT} ^80$
 RewriteRule ([^/]*)$ http://%{HTTP_HOST}/$0
  マニュアル: http://httpd.apache.org/docs/2.0/ja/mod/mod_rewrite.html

ちなみに
 SetenvIf SERVER_PORT 80 NO_SSL=1
 Deny from env=NO_SSL
という判定方法は SetenvIf から SERVER_PORT を参照できないため無理っぽい。

さらに余談。Apache-SSL には SSLRequireSSL と逆の働きをする (SSL なら拒否)、
SSLDenySSL というディレクティブが存在する。しかし mod_ssl には SSLDenySSL は
存在しないし、mod_ssl を取り込んだ形の Apache2 にも存在しない (Apache-SSL と
mod_ssl は別物
)。
PageTop