Debian7でWgetを使用してWebサイトで壊れたリンクを見つける方法
序章
WebページのHTMLリンクをクリックして、404 Not Foundエラーが発生したことは何回ありますか? ウェブページが時間の経過とともに移動または削除されることがあるため、リンク切れが存在します。 人間のウェブ訪問者や検索エンジンロボットが見つける前に、それらの壊れたリンクを見つけるのはウェブマスターの仕事です。 問題の修正が遅れると、ユーザーエクスペリエンスが低下し、検索エンジンのページランクが低下する可能性があります。
Webサイトに数ページ以上含まれている場合、個々のリンクを手動でチェックするのは手間がかかりすぎますが、そのタスクを自動化するツールは多数あります。 GoogleWebmasterToolsやWorldWideWeb Consortium(W3C)が提供するような、Webベースのアプリを使用できますが、通常、より高度な機能が不足しています。 WordPressを実行する場合はプラグインを使用できますが、一部の共有Webホスティング会社は、Webサイトと同じサーバー上で実行され、リンクチェックはリソースを大量に消費するため、プラグインを禁止しています。
別のオプションは、別のマシンでLinuxベースのプログラムを使用することです。 これには、壊れたリンクを検出する一般的なWebクローラー(wget
など)やカスタムビルドのリンクチェッカー(linkchecker
やklinkstatus
など)が含まれます。 これらは高度にカスタマイズ可能であり、ターゲットWebサイトの応答時間への悪影響を最小限に抑えます。
このチュートリアルでは、wget
を使用して、Webサイト上の壊れたリンクをすべて見つけて、修正できるようにする方法について説明します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 2つのDebian7ドロップレット。1つは( generic-1 )から
wget
を実行する汎用マシンで、もう1つはWebサイト( webserver-1 )をホストします。 - generic-1とwebserver-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サイト上の壊れたリンクを見つける方法と、それらのリンクを含むリファラーページを見つける方法について説明します。 壊れたリンクを更新または削除して、修正できるようになりました。