してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

HTTP/1.x(HTTP/0.9)の小技

HTTP/2対応していないブラウザ(クライアント)を探す方が難しい今日この頃ですが、Apache HTTPサーバは依然として古い標準に対応しています。

その代表的なものが、HTTP/0.9と呼ばれる、最初にドキュメント化されたHTTPプロトコルがあります。

かくいう私も、HTTP/0.9という単語を目にしたのは、10年ぶり、いやそれ以上でしょうか。

今回は、なつかしいHTTP/0.9を無効にする方法を紹介します。

HTTP/0.9を無効にする。

HTTP/0.9といっても、ピンと来ない方も多いかもしれません。

ドキュメント化された最初のHTTPプロトコルです。最初というだけ有って、HTTPプロトコルのバージョンという概念すらない時代の代物です。

例えば、HTTP/1.0以降は、GETやPOST等のメソッドの後に、リクエストのパスを書いて、その後ろに、HTTPプロトコルのバージョンを入れます。

ところが、HTTP/0.9では、メソッドの後に、HTTPプロトコルのバージョンが必要ありません。

telnetを使って、再現すると、以下のような感じです。

$ telnet localhost 80[改行]
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /[改行]

昔は、こんな感じで、Webサーバが動作していました。

リクエストヘッダを付けられないので、バーチャルホストや、KeepAliveに、もちろん対応していません。

 

このHTTP/0.9を無効にする方法を紹介します。

設定として、httpd.confの末尾に、以下の1行を加えます。

/usr/local/apache2/conf/httpd.conf
・・・(省略)・・・
HttpProtocolOptions Strict LenientMethods Require1.0

この、 HttpProtocolOptionsは、httpd 2.2.32以降 もしくは httpd 2.4.24以降で利用できます。

ちなみにHttpProtocolOptionsに、Strictがあると、厳密な解釈を行い、リクエストの改行がLFだけだったりすると、エラー扱いになります。(正しくは、CR+LF)

この厳密な解釈を行いたく無い場合は、Strictのかわりに、Unsafeとします。

続く、LenientMethodsは、GETやPOSTのメソッドといったHTTP標準のメソッド以外がリクエストされると、エラー扱いになります。

標準のメソッド以外を使いたい場合は、LenientMethodsの代わりに、RegisteredMethodsと変更し、さらに、RegisterHttpMethodディレクティブを使って、非標準のメソッドを追加することができます。

そして、当ページの趣旨とは逆に、HTTP/0.9を使いたい場合は、 Require1.0 の代わりに、Allow0.9とします。

毎度同じですが、apachctl -tで、設定ファイルの間違いが無いことを確認するため、下記のように

# /usr/local/apache2/bin/apachctl -t
Syntax OK
# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start

とします。Syntax OKと出なかった場合は、なにか間違ってます。

実際にHTTP/0.9が無効になっているか、試す方法は、さきほどと同じtelnetを使って確認できます。

$ telnet localhost 80[改行]
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /[改行]

ここで、HTTP/1.1 400 Bad Requestとでれば、無効になっています。

たとえば、私の環境では以下のようなレスポンスになっています。

$ telnet localhost 80[改行]
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /[改行]
HTTP/1.1 400 Bad Request
Date: Xxx, XX Nov 2017 08:59:02 GMT
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
Connection closed by foreign host.

HTTP/0.9も通信プロトコルである以上、セキュリティホールやDoSの要因になる可能性もあります。

そのため、不要ならば、HTTP/0.9プロトコルは切っておくと良いでしょう。

いまどき、HTTP/0.9にしか対応していないのは、古い検索エンジンの古いロボットくらいです。

NEXT >> トップページに戻る

©Copyrights 2015-2018, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。