序章

WebページのHTMLリンクをクリックして、404 Not Foundエラーが発生したことは何回ありますか? ウェブページが時間の経過とともに移動または削除されることがあるため、リンク切れが存在します。 人間のウェブ訪問者や検索エンジンロボットが見つける前に、それらの壊れたリンクを見つけるのはウェブマスターの仕事です。 問題の修正が遅れると、ユーザーエクスペリエンスが低下し、検索エンジンのページランキングが低下する可能性があります。

Webサイトに数ページ以上含まれている場合、個々のリンクを手動でチェックするのは手間がかかりすぎますが、そのタスクを自動化するツールは多数あります。 GoogleWebmasterToolsやWorldWideWeb Consortium(W3C)が提供するような、Webベースのアプリを使用できますが、通常、より高度な機能が不足しています。 WordPressを実行する場合はプラグインを使用できますが、一部の共有Webホスティング会社は、Webサイトと同じサーバー上で実行され、リンクチェックはリソースを大量に消費するため、プラグインを禁止しています。

別のオプションは、別のマシンでLinuxベースのプログラムを使用することです。 これらには、壊れたリンク(wgetなど)やカスタムビルドのリンクチェッカー(linkcheckerklinkstatusなど)も検出する一般的なWebクローラーが含まれます。 これらは高度にカスタマイズ可能であり、ターゲットWebサイトの応答時間への悪影響を最小限に抑えます。

このチュートリアルでは、wgetを使用して、Webサイト上の壊れたリンクをすべて見つけて、修正できるようにする方法について説明します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • 2つのDebian7ドロップレット。1つは( generic-1 )からwgetを実行する汎用マシンで、もう1つはWebサイト( webserver-1 )をホストします。

  • generic-1webserver-1の両方のsudo非rootユーザー。 手順については、ここをクリックしてください。

  • webserver-1にはLAMPスタックがインストールされている必要があります。 手順については、ここをクリックしてください。

  • オプションで、Webサーバーは独自の登録済みドメイン名を持つことができます。 その場合は、your_server_ipが表示されている場所でドメイン名を使用してください。 手順については、ここをクリックしてください。

このチュートリアルはDebian7向けに書かれていますが、wgetの例は他の最新のLinuxディストリビューションでも実行できるはずです。 デフォルトで含まれていない他のディストリビューションにwgetをインストールする必要がある場合があります。

ステップ1—サンプルWebページを作成する

まず、複数のリンクが欠落しているサンプルWebページを追加します。

webserver-1にログインします。 spiderdemo.htmlという新しいファイルを開いて、nanoまたはお気に入りのテキストエディタを使用して編集します。

sudo nano /var/www/spiderdemo.html

以下をファイルに貼り付けます。 これは非常に単純なWebページで、2つの壊れたリンクが含まれています。1つは内部(サーバーIPを下で強調表示されている場所に追加)と1つは外部です。

<html>
<head> <title>Hello World!</title> </head>
<body>

<p>
<a href="http://your_server_ip/badlink1">Internal missing link</a>.
<a href="https://www.digitalocean.com/thisdoesntexist">External missing link</a>.
</p>

</body>
</html>

ファイルを保存して閉じます。

次に、spiderdemo.htmlのファイル所有者とグループをデフォルトのWebサーバーユーザーwww-dataに変更します。

sudo chown www-data:www-data /var/www/spiderdemo.html

最後に、新しいHTMLファイルのファイル権限を変更します。

sudo chmod 664  /var/www/spiderdemo.html

これで、http://your_server_ip/spiderdemo.htmlにサンプルページが表示されます。

ステップ2—wgetを実行する

wgetは、Webクローラーとしても使用できる汎用のWebサイトダウンローダーです。 このステップでは、wgetを構成して、各リンクが既存のページを指しているのか、ページをダウンロードせずに壊れているのかを報告します。

注:所有しているWebサイトのリンクのみを確認してください。 Webサイトでのリンクチェックは、かなりのコンピューティングオーバーヘッドを招くため、これらのアクティビティはスパムとして解釈される可能性があります。

generic-1 にログインし、次のwgetコマンドを実行します。 各フラグの説明は以下のとおりです。 このコマンドは、ユースケースに合わせて変更できます。

wget --spider -r -nd -nv -H -l 1 -w 2 -o run1.log  http://your_server_ip/spiderdemo.html

必要な基本的なフラグは次のとおりです。

  • --spiderは、wgetによるページのダウンロードを停止します。

  • -rは、wgetがページ上の各リンクを再帰的にたどるようにします。

  • -ndは、--no-directoriesの略で、wgetがサーバー上にディレクトリの階層を作成しないようにします(スパイダーのみに構成されている場合でも)。

  • -nvは、--no-verboseの略で、wgetが壊れたリンクを識別するために不要な追加情報を出力するのを停止します。

以下は、検索をカスタマイズするために使用できるオプションのパラメーターです。

  • -Hは、--span-hostsの略で、wgetをサブドメインおよびプライマリドメイン以外のドメイン(つまり、 外部サイト)。

  • -l 1--levelの略です。 デフォルトでは、wgetは最初のURLから最大5レベルの深さまでクロールしますが、ここでは1に設定します。 Webサイトの構成によっては、このパラメーターを試す必要がある場合があります。

  • -w 2は、--waitの略で、サーバーへの攻撃を回避し、パフォーマンスへの影響を最小限に抑えるために、リクエスト間で2秒間待機するようにwgetに指示します。

  • -o run1.logは、wgetの出力を、端末に表示する代わりに、run1.logというファイルに保存します。

上記のwgetコマンドを実行した後、次のコマンドを使用して、出力ファイルから壊れたリンクを抽出します。

grep -B1 'broken link!' run1.log

-B1パラメーターは、一致するすべての行について、wgetが一致する行の前に先行コンテキストの1つの追加行を表示することを指定します。 この前の行には、壊れたリンクのURLが含まれています。 以下は、上記のgrepコマンドの出力例です。

http://your_server_ip/badlink1:
Remote file does not exist -- broken link!!!
https://www.digitalocean.com/thisdoesntexist:
Remote file does not exist -- broken link!!!

ステップ3—リファラーURLを見つける

ステップ2は壊れたリンクを報告しますが、リファラーWebページ、つまりそれらのリンクを含むサイト上のページを識別しません。 このステップでは、リファラーのWebページを見つけます。

リファラーURLを識別する便利な方法は、Webサーバーのアクセスログを調べることです。 webserver-1 にログインし、Apacheログで壊れたリンクを検索します。

sudo grep Wget /var/log/apache2/access.log | grep "HEAD /badlink1"    

上記のコマンドの最初のgrepは、wgetによるWebサーバーへのすべてのアクセス要求を検索します。 各アクセス要求には、 User Agent 文字列が含まれています。この文字列は、Web要求の生成を担当するソフトウェアエージェントを識別します。 wgetのユーザーエージェント*識別子はWget/1.13.4 (linux-gnu)です。

2番目のgrepは、壊れたリンクの部分的なURL(/badlink1)を検索します。 使用される部分的なURLは、ドメインに続くURLの部分です。

grepコマンドチェーンからの出力例は次のとおりです。

111.111.111.111 - - [10/Apr/2015:17:26:12 -0800] "HEAD /badlink1 HTTP/1.1" 404 417 "http://your_server_ip/spiderdemo.html" "Wget/1.13.4 (linux-gnu)"   

リファラーURLは、行の最後から2番目の項目http://your_server_ip/spiderdemo.htmlです。

結論

このチュートリアルでは、wgetツールを使用してWebサイト上の壊れたリンクを見つける方法と、それらのリンクを含むリファラーページを見つける方法について説明します。 これで、壊れたリンクを更新または削除して修正を行うことができます。