いつもアクセスしているウェブサイトが突然Access Deniedのエラーになることがある。 この手に対策によく見るのは、クッキーやキャッシュを削除しろというものだ。単にサーバーがメンテテナンス中で、しばらく経てば直るということもある。しかし、先日、私が経験したのは、そのどちらでも解決しなかったので、参考までに書いておこうと思う。

ある日、ときどき利用する、あるネットショップにアクセスすると、Access Deniedが表示されて閲覧できないことに気付いた。

ブラウザはGoogle Chromeを使っていて、複数のGoogleアカウントで使いわけている。そのひとつでなぜかアクセスできない。他のアカウントだと問題ないので、買い物をするのに困ったわけではない。

クッキーを削除しても変化なし。キャッシュを削除したり、ブラウザを再起動してみたり、WAN側を再起動してIPアドレスを変更してみたりしたが同じ。シークレットウィンドウでアクセスすると正常に閲覧できるという、いまひとつよくわからない状態だった。

いろいろ調べた結果、原因は、Chromeが最初に送信するHTTPリクエストのaccept-languageヘッダーの違いで、サーバーのアクセス制限にひっかかっていることがわかった。

正常にアクセスできるHTTPリクエストは次のとおり。

accept-language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7

一覧にすると次の4つが設定されている。

  • ja-JP
  • ja
  • en-US
  • en 末尾のq=0.9などは優先順位で1と0の間の数字を指定する。最優先はja-JPの1.0でその数値は省略されている。

一方、Access DeniedされたHTTPリクエストには、微妙な違いがあった。

accept-language: ja,en-US;q=0.9,en;q=0.8

  • ja
  • en-US
  • en ja-JPがない。

しかし、どちらのChomeも、設定画面の優先言語は同じになっている。

優先言語の設定NG

設定画面では同じなのに、なぜaccept-languageの値が違うのか?の理由はさておき、とりあえず、Access DeniedになるChromeで、優先言語の設定を次のように英語(アメリカ合衆国)を削除して試しみた。

優先言語の設定OK

これで正常にアクセスができるようになった。

ということは、今回のネットショップに関して言えば、今回の事象は、HTTPリクエストのアクセス制御にひっかかっていたと言える。

試しに言語設定をいろいろ変更してみて、わかったのは、accept-languageの値の先頭がja,en-USで始まるときにアクセス制御がかかるようだ。ja-JP,ja,en-USだと問題ないので、単にサーバーの設定の問題のように思えるが、どちらの振舞いが正しいのかはわからない。

利用者の立場として、Access Deniedになる原因にはこんなこともあるのだと妙に感心したので記事にしてみた。今回はaccept-languageだったが、どのヘッダーでアクセス拒否されているかは調べてみないとわからない。Google ChomeのDevToolsが役に立った。

ところで、Chromeの優先言語の設定は同じ日本語なのに、リクエストヘッダーのaccept-languageの値がjaだったり、ja-JP,ja;q=0.9する現象については、原因がまたわかったら記事にしたいと思います。