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

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

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

本記事の読者層

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

WEBサイトで現れる「エラー404」の意味と原因は?

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

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

この404エラーの原因として以下の理由が考えられます。

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

404エラーが発生することで、ウェブサイトの流入経路が寸断され、サイトへのアクセス機会の損失となり放置はできません。HTTPサーバーとして、apache2で運用している前提で解決方法を以下で紹介します。

ステータスコード一覧

情報応答:コード 100-199

成功応答:コード 200-299

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

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

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

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

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

その他の詳細なステータスコードの意味はこちら

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

apache 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エラーがでる場合には以下のような可能性があります。

  1. そもそもファイルが「存在しない」もしくは「リンク切れ」。
  2. 該当先のファイル名の文字コードに問題がある。
  3. ブラウザ上にキャッシュが残っている可能性。
  4. サーバーがダウン中。→「時間」をおいて再接続を確認してみてください。

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

この場合は、ファイルをアップロードし直しましょう。

ファイルがあるのに「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 ファイル名

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

→「キャッシュ」をクリアしてみてください。

サーバーがダウン中。

「時間」をおいて再接続を確認してみてください。

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

エラーの原因を確認しても良いですが、最短の解決法を紹介します。

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

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

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

自分だけのオリジナル「404エラーページ」の作成

また、上記は、ホームページトップに転送する方法でしたが、自分だけのオリジナル404ページを作成し転送するのも良い案です。

まとめ

本記事のポイント

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

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

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

関連リンク

コメントを残す

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