如何在Debian7上使用Wget在您的网站上查找损坏的链接
介绍
您有多少次单击网页上的 HTML 链接却得到 404 Not Found 错误? 存在损坏的链接是因为网页有时会随着时间的推移而被移动或删除。 网站管理员的工作是在人类网络访问者或搜索引擎机器人之前找到那些损坏的链接。 延迟纠正问题会导致糟糕的用户体验并可能对搜索引擎页面排名造成不利影响。
如果您的网站包含多个页面,手动检查每个单独的链接会变得过于劳动密集,但有许多工具可以自动执行该任务。 您可以使用基于 Web 的应用程序,例如 Google 网站管理员工具和万维网联盟 (W3C) 提供的应用程序,但它们通常缺乏更高级的功能。 如果您运行 WordPress,则可以使用插件,但一些共享网络托管公司禁止它们,因为它们与网站在同一台服务器上运行,并且链接检查是资源密集型的。
另一种选择是在单独的机器上使用基于 Linux 的程序。 这些包括一般的网络爬虫,也可以发现损坏的链接(如 wget
)和定制的链接检查器(如 linkchecker
和 klinkstatus
)。 它们是高度可定制的,可以最大限度地减少对目标网站响应时间的负面影响。
本教程介绍如何使用 wget
查找网站上所有损坏的链接,以便您更正它们。
先决条件
要遵循本教程,您将需要:
- 两台 Debian 7 Droplet,一台从 (generic-1) 运行
wget
的通用机器和一台托管您的网站 (webserver-1) 的通用机器。 - generic-1 和 webserver-1 上的 sudo 非 root 用户。 点击这里获取说明。
- webserver-1 需要安装 LAMP 堆栈。 点击这里获取说明。
- 或者,网络服务器可以拥有自己的注册域名。 如果是这样,请在您看到
your_server_ip
的任何地方使用您的域名。 点击这里获取说明。
尽管本教程是为 Debian 7 编写的,但 wget
示例也应该在其他现代 Linux 发行版上运行。 您可能需要在默认不包含的其他发行版上安装 wget
。
第 1 步 - 创建示例网页
首先,我们将添加一个包含多个缺失链接的示例网页。
登录 webserver-1。 使用 nano
或您喜欢的文本编辑器打开一个名为 spiderdemo.html
的新文件进行编辑。
sudo nano /var/www/spiderdemo.html
将以下内容粘贴到文件中。 这是一个非常简单的网页,其中包含两个断开的链接,一个是内部链接(在下面突出显示的位置添加您的服务器 IP)和一个外部链接。
<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
的文件所有者和组更改为默认的网络服务器用户 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
是一个通用的网站下载器,也可以用作网络爬虫。 在此步骤中,我们将配置 wget
以报告每个链接是否指向现有页面或在未下载页面的情况下已损坏。
注意: 只检查您拥有的网站上的链接。 网站上的链接检查会产生大量的计算开销,因此这些活动可能被解释为垃圾邮件。
登录 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 爬取最多五层,但这里我们将其设置为一层。 根据您网站的组织,您可能需要使用此参数。-w 2
,--wait
的缩写,指示wget
在请求之间等待 2 秒,以避免轰炸服务器,最大限度地减少任何性能影响。-o run1.log
将wget
的输出保存到名为run1.log
的文件中,而不是在终端中显示它。
运行上述 wget
命令后,使用以下命令从输出文件中提取损坏的链接。
grep -B1 'broken link!' run1.log
-B1
参数指定,对于每个匹配行,wget
在匹配行之前显示额外的前导上下文行。 前一行包含损坏链接的 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 步 — 查找引荐来源网址
第 2 步报告损坏的链接,但不识别引荐来源网页,即您网站上包含这些链接的网页。 在此步骤中,我们将找到引荐来源网页。
识别引荐来源网址的一种便捷方法是检查网络服务器的访问日志。 登录到 webserver-1 并在 Apache 日志中搜索损坏的链接。
sudo grep Wget /var/log/apache2/access.log | grep "HEAD /badlink1"
上述命令中的第一个 grep
查找 wget
对 webserver 的所有访问请求。 每个访问请求都包含 User Agent 字符串,它标识负责生成 Web 请求的软件代理。 wget
的用户代理*标识符是 Wget/1.13.4 (linux-gnu)
。
第二个 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)"
引荐来源网址是该行的倒数第二项:http://your_server_ip/spiderdemo.html
。
结论
本教程介绍如何使用 wget
工具查找网站上的损坏链接,以及如何查找包含这些链接的引荐来源网页。 您现在可以通过更新或删除任何损坏的链接来进行更正。