![]() 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にしか対応していないのは、古い検索エンジンの古いロボットくらいです。
|