ことの始まり
わけあって、ユーザーが使用する言語によって表示するページを変えようとした。
方法としては、$_SERVER['HTTP_ACCEPT_LANGUAGE']
を使い以下のような感じで分岐させていた
※実際のコードとは異なります
if ((substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0,2)) == 'ja'){return redirect()->route('日本語のページ');}
return redirect()->route('英語のページ');
上記の方法で、本番環境でも一切の問題なくwebアプリは正常に動作した。
しかし、サーチコンソールではインデックスが登録されない。
原因(ただの推測)
$_SERVER['HTTP_ACCEPT_LANGUAGE']
の部分を消してみたらインデックスが登録されたので。
クローラーではHTTP_ACCEPT_LANGUAGE
にあたる値がなかったため$_SERVER['HTTP_ACCEPT_LANGUAGE']
の部分で止まってしまったと推測
対処
今現在はバックエンドで自動的に分岐するのは諦めて、ユーザーが言語を選ぶようにした。
try catch
を使った以下のような対処もあるが、訳あって今回はこの方法は取れなかった。
try {
if ((substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0,2)) == 'ja'){return redirect()->route('日本語のページ');}
} catch (\Throwable $th) {
//エラーが起きてしまった時
return redirect()->route('英語のページ');
}
// ユーザーの言語が日本語ではない
return redirect()->route('英語のページ');
駄文
クローラーの仕様を全く知らなかったため、このエラーの解決に1週間以上かかってしまった。
かなりマイナーなエラーかもしれないが、他の人が、私と似たようなエラーが起きた時にこの記事を参考にして短い時間でエラーが解決すると私としても嬉しい
フロントエンドの方にvueを使っているのだが以下の方法をこの記事を書いているうちに思いついた。
- 英語のページに遷移
- mountedでユーザーの言語を判断して
- ユーザーの言語が日本語の場合、日本語のページに遷移する