apacheでHTTPステータスコードごとのエラーを発生させる方法(ErrorDocument検証)

ここではapacheの各HTTPステータスコードを発生させる方法を記載します。

業務でエラードキュメント(ErrorDocument)の設定内容を検証するのに使っていました。

4xx Client Error クライアントエラー

400 Bad Request

400のエラーはヘッダ情報を不正な形にすると簡単に起こせます。例えば、以下のようにHostヘッダを複数指定すると400エラーになります。

curl -H "Host: hoge.masaki-blog.net, fuga.masaki-blog.net" http://localhost/

他にもHTTP/2に対応していないサーバで以下のように指定しても発生します。

curl -H ":authority: masaki-blog.net" http://localhost/

403 Forbidden

403のエラーはサーバの設定で禁止しているアクセスを行うと発生させることができます。

例えば、以下のように特定ディレクトリへのアクセスが不可になっているとします。

<Directory "/usr/local/apache2/htdocs/denied/">
    Require all denied
</Directory>

この時、以下のようにアクセスすれば403エラーになります。

curl http://localhost/denied/

他にもIPアドレスでの制限など様々な設定ができるので、実際の検証の際は設定に合わせてアクセスすれば良いと思います。

404 Not Found

404のエラーは単純に存在しないURLを指定すれば発生させることができます。

例えばhogeというリソース(ディレクトリなど)がない状態で以下のようにアクセスすると404エラーになります。

curl http://localhost/hoge

これは一番簡単に起こせるエラーだと思います。

405 Method Not Allowed

405のエラーは許可されていないHTTPメソッドでアクセスすると発生させることができます。

例えば、PUTが許可されていないサーバに対して以下のようにアクセスすると405エラーになります。

curl -X PUT http://localhost/

421 Misdirected Request

421のエラーはSSL証明書を作成した際のドメイン名と異なるドメインでアクセスしたところ発生しました。

以下はSSL証明書(オレオレ証明書)の作成時に「test.masaki-blog.net」というドメインで証明書を作成し、「web1.masaki-blog.net」というドメインでアクセスした例です。

$ curl --cacert confssl/server.crt https://web1.masaki-blog.net/ -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to web1.masaki-blog.net (127.0.0.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: confssl/server.crt
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=test.masaki-blog.net
*  start date: Mar 16 13:48:43 2020 GMT
*  expire date: Apr 15 13:48:43 2020 GMT
* SSL: certificate subject name 'test.masaki-blog.net' does not match target host name 'web1.masaki-blog.net'
* stopped the pause stream!
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):
curl: (51) SSL: certificate subject name 'test.masaki-blog.net' does not match target host name 'web1.masaki-blog.net'
$

5xx Server Error サーバエラー

501 Not Implemented

501はサーバーで実装されていないHTTPメソッドでアクセスすると発生させることができます

公式に規定されているものではない適当なHTTPメソッドでもOKのため、以下のようにアクセスすることで501エラーを起こすことができます。

curl -X HOGE http://localhost/

コメント

タイトルとURLをコピーしました