ブラウザ上で該当ページが存在しない場合、「Not Found. The requested URL was not found on this server」というエラーがでることはありませんか。これは通称「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で運用している前提で解決方法を以下で紹介します。
サーバーにおけるアクセスログから原因究明
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) |
ここで知りたいエラーコードの情報は7番目の「ステータスコード」欄です。404コードもここに記録されます。
以下のCutコマンドで行の中の一部を取り出してこのステータスコードを取り出します。
$ 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エラーが発生して表示されないことはありませんか?
このような場合はファイル名に使用されている文字コードが原因の可能性もあります。該当のファイル名の文字コードを確認してみてください。例えば、ファイルのアップロード時に「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エラー」が発生した場合の最短解決法としてホームページトップに飛ばす方法が有効。