「404」エラーの原因 と解決法: サーバのアクセスログから解析

この記事は 2 分で読めます。
概要

 ブラウザ上で該当ページが存在しない場合、「Not Found. The requested URL was not found on this server」というエラーがでることはありませんか。これは通称「404」と呼ばれるエラーで、この状態ではサイトへのユーザー流入経路が寸断され、アクセス機会が損失するためサーバ管理者としては放置はできません。今回はサーバ運用側の視点から404エラーの解決方法を紹介します。

本記事の読者層

「404」エラーの原因 で困っている方

404の「エラー」の意味と原因は?

 ネット閲覧しているとしばしばクリック先のURLで現れる「Not Found. The requested URL was not found on this server」、これは「サーバ上にファイルが存在しないこと」を示すエラーがです。

 この表示はサイトを訪れたが、何らかの理由でページにアクセスできないときのエラー表記で、通称「404エラー」と呼ばれています。「404」という数字はHTTPのステータスコードの1つです。まさに、エラーの種類を返してくれる番号です。

 以下に、主なステータスコードの一覧を表示します。

ステータスコード一覧

情報応答:コード 100-199

成功応答:コード 200-299

リダイレクトメッセージ:コード 300-399

クライアントのエラー応答コード 400-499

サーバエラー応答: コード 500-599

400番台のステータスコードでよく知られているものに

「404 Not Found」 と同様にエラーとして「403 Forbidden」 (アクセス権がありません)があります。

その他の詳細なステータスコードの意味はこちらをご覧下さい。

 この404エラーの原因がなぜおこるのでしょうか。主に以下の理由が考えられます。

  • URLまたは該当コンテンツファイル・画像などが内部リンクを調整することな削除または移動された場合
  • 作成プロセスまたは再設計中にURLが誤ってリンクされた場合
  • 閲覧者がブラウザ誤ったURLを入力された場合
  • URL先の該当サーバ実行されていないか、接続が切断された場合
  • 入力されたドメインがIPアドレスに変換できない場合、もしくはドメイン名が存在しない場合

 このように、404エラーが発生することで、ウェブサイトの流入経路が寸断され、サイトへのアクセス機会の損失となり放置はできません。

次に、その解決方法について言及してようと思います。

「404エラー」のどこに問題があるのか

 上記様々な理由により、ユーザー側にとって404が発生する例を示しましたが、この原因をサーバー管理者側から整理すると以下のような要因があると考えられます。これよりページに404エラーがでる場合の解決方法を考えていきます。

サーバー側に問題がある場合

  • サーバー全体に問題がある場合
  • 特定のページだけに問題がある場合

ファイル自身に問題がある場合

  • ファイルが「存在しない」場合
  • ファイルがあるのに「404エラーが」表示される場合

ブラウザー側に問題がある場合

  • ブラウザ上にキャッシュが残っている可能性

サーバー側に問題がある場合

サーバー全体に問題がある場合

サーバがメンテナンス中、もしくは何かの理由でネット回線が停止している場合もあります。

解決方法しばらく「時間」をおいて再接続を確認してみてください。

特定のページだけに問題がある場合

  1. そもそもファイルが「存在しない」もしくは「リンク切れ」→ファイル自身に問題がある場合を参照
  2. 該当先のファイル名の文字コードに問題がある。
  3. ブラウザ上にキャッシュが残っている可能性。
  4. リダイレクトの設定が失敗している場合がある。

ファイル自身に問題がある場合

ファイルが「存在しない」場合

この場合は、何らかの理由により削除、移動された可能性があります。

解決方法再度FTPサーバなどでファイルをアップロードし直しましょう。

ファイルがあるのに「404エラーが」表示される場合

ファイルがあり、パスもあってるのに404エラーが発生して表示されないことはありませんか?

解決方法該当先のファイル名の文字コードに問題があることがあります。このような場合はファイル名に使用されている文字コードが原因の可能性もあります。該当のファイル名の文字コードを確認してみてください。例えば、ファイルのアップロード時に「UTF-8」の文字コードが別の文字コードに変わっていることもあります。

このコマンドで、文字列がutf-8かどうかを確認できます。

fileコマンドで確認

サーバ内で以下のfileコマンドを用いて、ファイル名

$ file -i ファイル名

例えば、
$ file -i link_checker.py
$ link_checker.py: text/x-python; charset=utf-8

nkfコマンドで確認

もしくは以下のnkfコマンドを用いて文字コードの確認も可能です。

$ sudo apt-get install nkf
$ nkf -guess ファイル名

ブラウザー側に問題がある場合

ブラウザ上にキャッシュが残っている可能性

解決方法主要ブラウザで「キャッシュ」をクリアしてみてください。

キャシュをクリアする方法は、Google,Safari, Microsoft Edge, Firefoxなどで異なりますので各設定を確認して見てください。

サーバにおけるアクセスログから原因究明

HTTPサーバ運営者の立場から、解決方法を以下で紹介します。

apache2でWEBサーバーを運用している場合を想定します。ログ解析を行うことでその原因が解明できます、まず、 httpサーバでaccess.logファイルを参照し、「404のエラー」の原因を探ります。

404 not found を見つける方法

Ubuntu 18.04 LTSの場合、ディレクトリ「/var/log/apache2」にaccess.logファイルがあります。フォルダに移動後をlsコマンドでファイルを確認すると以下のように表示されます。

$ ls
access.log        access.log.12.gz  access.log.3.gz  access.log.7.gz  error.log.1      error.log.13.gz  error.log.3.gz  error.log.7.gz
access.log.1      access.log.13.gz  access.log.4.gz  access.log.8.gz  error.log.10.gz  error.log.14.gz  error.log.4.gz  error.log.8.gz
access.log.10.gz  access.log.14.gz  access.log.5.gz  access.log.9.gz  error.log.11.gz  error.log.16.gz  error.log.5.gz  error.log.9.gz
access.log.11.gz  access.log.2.gz   access.log.6.gz  error.log        error.log.12.gz  error.log.2.gz   error.log.6.gz  other_vhosts_access.log

*.gzはアーカイブ化 (GZIP形式) されており、acccess.log内に直近のログが収録されています。

これらのログファイルは古いモノほど番号が大きくなります。最新のログファイルは数字が付いていない「access.log」です。

ログファイルの中身を確認する方法

このログファイルは、access.log内のある一行を抜粋すると、以下のように表示されます。

60.40.xxx.xxx - - [11/Sep/2022:00:10:35 +0900] "GET /blog/ HTTP/1.1" 200 16549 "-" "Mozilla/5.0 (Windows) mirall/2.11.1 (build 8438) (ownCloud, windows-10.0.22000 ClientArchitectu
re: x86_64 OsArchitecture: x86_64)"

apache2の設定ファイルでは、このLogFormatは以下のように表示されています。

LogFormat “%h %l %u %t \”%r\” %t %b \”%{Referer}i\” \”%{User-Agent}i\””

#Format名称説明
1%h リモートホストのIPアドレス60.40.xxx.x
2%l接続先のユーザー名-(未設定)
3%uリモートユーザー名-(未設定)
4%tアクセスされて日時[11/Sep/2022:00:10:35 +0900]
5\”%r\” アクセスされたファイルGET /blog/ HTTP/1.1″
7%tステータスコード200
8%bリソースに対する転送量16549
9\”%{Referer}i\”アクセス元のURL-(未設定)
10\”%{User-Agent}i\”なんのOSでどのブラウザからアクセスしてきたかMozilla/5.0 (Windows) mirall/2.11.1 (build 8438) (ownCloud, windows-10.0.22000 ClientArchitectu
re: x86_64 OsArchitecture: x86_64)
access.log

ここで知りたいエラーコードの情報は7番目の「ステータスコード」欄です。404コードはここに記録されますね。

ログファイルの簡単な解析方法

以下のCutコマンドで行の中の一部を取り出してこのステータスコードを取り出します。

Cutコマンドの引数指定

① -dで分割する文字数を指定。

② -f で分割した〇番目のフィールを取り出す。

 $ cat access.log | cut -d ' ' -f 9 | sort | uniq -c | sort -nr
   9026 200
   3704 302
    140 304
    108 301
     32 "-"
     27 206
     12 404
     10 400
      6 401
      2 201

ここで、アクセスログの各行に書かれているログから、スペース文字 (「’ ‘」) で分割した9番目 (「-f 9」)がちょうど、ステータスコードになり、これをパイプ(|)でソート・カウントするコマンドになります。

ここで、404のエラーが12件表示されているがわかります。

別の解析方法として、404エラーの数が少ない場合であれば、直接 grepで確認できます。

$cat access.log | grep '" 404'
66.249.XX.XX - - [18/Sep/2022:09:05:48 +0900] "GET /blog/archives/date/2022/page/11 HTTP/1.1" 404 66101 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

ここから、上の表を参考にするとページ「/blog/archives/date/2022/page/11」(=「アクセスされたファイル」)が、404エラーが現れるページです。

ログ解析から「アクセスされたファイル」から404の該当ページを特定したので、

次に「404エラー」が出ないように対策します。

「404エラー」の最短解決法:404エラーをリダイレクトする方法

エラーの原因を確認していくこともできますが、ここでは最短の解決法を二つ紹介します。

404の回避方法としてトップページに転送

 回避方法として、サイトトップの直下に「.htaccess」を置き以下のような一行を加えておくと、エラーが出ずに読者の離脱を防ぐことができます。

ErrorDocument 404 https://www.domain.com/

ここで、「https://www.domain.com/」は自身ページのトップページを示します。これで、404が出た場合に読者がすぐにトップページに転送してくれます。

オリジナル「404エラー」ページの作成

上述は。「404エラー」の回避方法としてホームページトップに転送する方法でした。逆に、自身のページだけのオリジナル404ページを作成し転送するのも良い案です。企業などではこのようなエラーページをアレンジしてそのものを1つのコマーシャルなどにしているケースもあります。

例えば、下記のケースは米国Disneyの404ページです。

404 page disney

まとめ

本記事のポイント

✔ WEBサイトで現れる「エラー404」はこれはサイトを訪れたが、何等かの理由でページにアクセスできないとき表示

✔ apache webサーバにおけるアクセスログから原因究明ができる。

✔「404エラー」が発生した場合の最短解決法としてホームページトップに飛ばす方法が有効

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です