414エラーに遭遇した話


はじめに

あるWebシステムを開発中、HTTPの414エラーに遭遇したので、実際に出ることがあるということ忘れないためにメモしておきます。

そもそもステータスコード414とは?

  • 400番台ステータスコード
    • リクエスト失敗である場合のコード
  • 414ステータスコード
    • URIが長過ぎるためにサーバーの処理可能範囲を超えている

なぜ起きたか

開発していたシステムではGETパラメータを多用している状況でした。修正を加えたところ、GETパラメータの値の文字列がかなり長くなってしまい結果414エラーが起きるケースが増えてしまいました。
つまり現状その414エラーは誰でもURLを長くすれば起こすことができるようになっています。
例えば、https://test.com?a=a&a=a&a=a&a=a&a=a&a=a&a=a&a=a.........&a=a のようなリクエストを送ると414エラーとなるということです。

Apacheの設定

LimitRequestLineの設定でデフォルトではURLの長さは8190となっています。
許容バイト数を長くすることもできますが、必要な数値に合わせるべきであるため異常に長くするのはよくないと思います。

対策

問題点としては以下がありました。
- 表示される画面がApacheのデフォルトのエラー画面
- ユーザーの通常の操作で起こりえてしまう(URLをユーザーが異常に長いURLに書き換えるとエラーになってしまうのは404エラーが起きてしまうのと同様のため問題ではない)

解決策としては、以下になります
- GETパラメータの長さが異常に長いのが原因だったため、POSTメソッドに変更してサーバに渡したいパラメータはメッセージボディで渡すことで、URLを短くする

Apacheを使っているサイトはどこでもApacheのデフォルトに画面が表示

いくつかApacheを仕様していいるサイトを探して長いGETパラメータをつけたURLでアクセスするとやはりApacheのデフォルトの「Request-URI Too Large
」の画面が表示されました。
この画面は見えちゃっていいものなんですかね。。。
404エラーの場合は独自の404エラーページを表示していますが、414の場合もそういった画面が出るようにした方がユーザー的にはいいのかなと個人的に思います。

所感

WebサーバをApacheを利用しているサイトを探しましたが、なかなか見つかりませんでした。古そうであったり小規模な企業のサイトで使われている感じですかね。
nginxを利用している会社が多い感覚でした。今後もう少しWebサーバの知識を深めていきたいですね。