前書き

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

Webサイトに複数のページが含まれている場合、個々のリンクを手動で確認するのは手間がかかりすぎますが、そのタスクを自動化するツールが多数あります。 Google Webmaster ToolsやWorld Wide Web Consortium(W3C)が提供するようなWebベースのアプリを使用できますが、通常は高度な機能がありません。 WordPressを実行する場合、プラグインを使用できますが、一部の共有Webホスティング会社はWebサイトと同じサーバーで実行され、リンクチェックがリソース集約型であるため、それらを禁止しています。

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

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

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • 2つのDebian 7ドロップレット、1つは「+ wget +」を実行する汎用マシン(* generic-1 )、もう1つはWebサイトをホストします( webserver-1 *)。

  • * generic-1 webserver-1 *の両方のsudo非rootユーザー。 手順については、https://www.digitalocean.com/community/tutorials/how-to-add-delete-and-grant-sudo-privileges-to-users-on-a-debian-vps [ここをクリック]をクリックしてください。

  • * webserver-1 *には、LAMPスタックがインストールされている必要があります。 手順については、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian [ここをクリック]を参照してください。

  • オプションで、Webサーバーは独自の登録済みドメイン名を持つことができます。 その場合、 `++`が表示されている場所でドメイン名を使用します。 手順については、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [ここをクリック]を参照してください。

このチュートリアルはDebian 7向けに書かれていますが、 `+ wget `サンプルは他の最新のLinuxディストリビューションでも実行されるはずです。 デフォルトで含まれていない他のディストリビューションに ` wget +`をインストールする必要があるかもしれません。

ステップ1-サンプルWebページの作成

最初に、複数のミッシングリンクを含むサンプルWebページを追加します。

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

sudo nano /var/www/spiderdemo.html

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

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

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

</body>
</html>

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

次に、ファイルの所有者とグループ「+ spiders demo.html」をデフォルトのウェブサーバーユーザー「+ www-data +」に変更します。

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

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

sudo chmod 664  /var/www/spiderdemo.html

サンプルページは `+ http:/// spiderdemon.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:///spiderdemo.html

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

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

  • `+ -r `は、ページ上の各リンクを再帰的にたどる ` wget +`を作成します。

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

  • 「-no-verbose +」の略である「 -nv 」は、「 wget +」が壊れたリンクを識別するのに不要な追加情報を出力しないようにします。

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

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

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

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

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

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

grep -B1 'broken link!' run1.log

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

http:///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を識別する便利な方法は、ウェブサーバーのアクセスログを調べることです。 * webserver-1 *にログインし、Apacheログで壊れたリンクを検索します。

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

上記のコマンドの最初の `+ 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:///spiderdemo.html" "Wget/1.13.4 (linux-gnu)"

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

結論

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