404 not found (404エラー) の原因 と解決法: サーバのアクセスログから解析

404エラー 404
この記事は 2 分で読めます。
概要

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

管理人

本記事の読者層は以下の方を想定しています。

本記事の読者層
  • ブログを運営している人
  • インターネット検索中に404エラーに遭遇しその原因を知りたい人
  • サーバー運営者で404の原因を知りたい人
目次

404 not found とは ?(404エラーとは?)

 ネット閲覧しているとしばしばクリック先のURLで現れる「Not Found. The requested URL was not found on this server.」

これは「サーバ上にファイルが存在しないこと」を示すエラーがです。

 この表示はサイトを訪れたが、何らかの理由でページにアクセスできないときのエラー表記で、通称「404エラー」と呼ばれています。

「404」という数字はHTTPのステータスコード(HTTP response status codes)の1つです。

つまり、このHTTP ステータスコードという番号でエラーの種類を特定できます。

このエラーコードには、5 つのクラスリに分類されます。

ステータス コードの最初の桁は応答のクラスを定義しますが、最後の 2 桁には分類や分類の役割はありません。

あります。

 以下に、標準で定義されている5つのクラスのステータスコード一覧を表示します。hj

ポイント

情報応答:コード 100-199

成功応答:コード 200-299

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

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

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

#コード名称説明
1xx100-199情報応答リクエストが継続中であることをクライアントに通知
2xx200-299成功応答成功した応答が受信され、解釈が修正され、受け入れを通知
3xx300-399リダイレクトメッセージリクエスト完了前にアクションを実行する必要があることを通知
4xx400-499クライアントのエラー応答リクエスト構文に問題がありリクエストを完了できないことを通知
5xx500-599サーバエラー応答有効なリクエストだがサーバーの問題により完了できないことを通知
エラーコード一覧

覚えておきたいコードとして、
400番台のステータスコードでよく知られているものに 「404 Not Found」 と同様にエラーとして「403 Forbidden」 (=アクセス権がありません)があります。

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

 

404エラーを修正すべき理由

404 エラーの修正を優先すべき主な理由は次のSEO対策の改善に繋がるためです。

404エラーを改善することでSEO効果が上昇

サイトナビゲーションの改善

リンク切れにより 404 が発生し、ユーザーエクスペリエンスが低下します。 404 を修正すると、サイトのナビゲーションが改善され、ユーザーがサイトに留まり続けます。

検索エンジンのペナルティを回避

404 が多すぎると、サイトがペナルティを受けたり、検索結果で降格されたりする可能性があります。それらを修正すると、サイトが良好な状態に保たれます。

404エラーを改善することでサイト運用効果が上昇

失われたトラフィックを節約

404 ページへのリンクにより、トラフィックと潜在的なコンバージョンが失われます。これらの URL をリダイレクトすると、トラフィックが維持されます。

古いコンテンツを更新

404 は、更新によりリンク先が消失または削除する必要がある古いコンテンツを洗い出すのに役に立ちます。

404 エラーの解決は時間がかかりますが、その効果として検索でのパフォーマンスが向上し、ユーザー フレンドリーなサイト改善が期待されます。

404エラーの原因はどこにあるのか? (404 error)

この404エラーはなぜおこるのでしょうか

エラーには、以下の理由が考えられます。

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

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

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

404エラーの原因と対処方法

 上記様々な理由により、ユーザー側にとって404が発生する例を示しましたが、この原因をサーバー管理者側から整理すると以下のような要因があると考えられます。

これよりページに404エラーがでる場合の解決方法を考えていきます。

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

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

ブラウザ上で表示されているものが古く宛先となるURLが既に存在していない可能性があります。

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

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

URLが間違っている可能性

URLを間違って入力した人為的エラーの可能性があります。

解決方法URLが単に間違っている可能性、もしくは古いリンクのためサーバーが移転している可能性があります。

キーワードをもとにgoogleにて再検索を行い新しいリンク先を手に入れることをお勧めします。

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

③サーバーの運営そのものに問題がある可能性

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

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

④ファイル転送に失敗している可能性

リダイレクトの設定が失敗している場合がある。この場合、.htaccessの転送を確認すべきです。

解決方法サーバー内の.htaccessもしくはhttpサーバーの設定を確認してみましょう。

⑤ファイル/URLが存在しない可能性

そもそもファイルが「存在しない」もしくは「リンク切れ」している可能性があります。もしくは、何らかの理由によりサーバー側でファイル(ページ)が削除、移動された可能性があります。

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

⑥ファイル名のコードに問題がある可能性:ファイルがあるのに404の場合

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

実際には、問題を特定することを個別に行うことが難しいためログからエラーを見つける方法を次の章で紹介します。

それ以外の場合

上記の④から⑥でも原因が分からない場合はサーバー側のアクセスログから原因を究明する方法があります。

次の章では、その方法を調べます。

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

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エラーのページ作成方法

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

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

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

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

オリジナルの404 pageの作成

上述は404エラーの回避方法としてホームページトップに転送する方法でした。

逆に、自身のページだけオリジナル404ページを作成し転送するのも良い案です。

企業などではこのようなエラーページをアレンジしてそのものを1つのコマーシャルなどにしているケースもあります。

例1:下記のケースは米国Disneyの404エラーのページです。

https://www.disney.com

404エラー page Disney

*日本国内からだとjpにリダイレクトされてしまうため言語を変えて以下でアクセスしてみてください。

例2:下記のケースは米国StarWarsの404のページです。

https://www.starwars.com/err

404エラー page starWars

404エラー1つとっても購読者に飽きさせない工夫には学びがいっぱいあると感じます。

まとめ

本記事のまとめ
  • WEBサイトで現れる「404エラー」はこれはサイトを訪れたが、何等かの理由でページにアクセスできないとき表示
  • apache webサーバにおけるアクセスログから原因究明ができる。
  • 「404エラー」が発生した場合の最短解決法としてホームページトップに飛ばす方法が有効

次回の記事をご期待下さい。どうぞよろしくお願いいたします。

関連リンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次