我正在寻找区分网址中的拼写错误和实际断开的链接。例如:
错字:
www.google/com
断开的链接:
www.thislinkpointstonothing.org
我希望我的应用程序将第一个 URL 识别为格式错误,并指示第二个 URL 在查询时返回 404 未找到。我可以使用 perl 模块或正则表达式来区分吗?
我试图区分由于拼写错误导致的错误链接,或者 - 如果链接遵循 RFC - 如果错误链接仅仅是由于页面不再存在。
您正在谈论两种不同类型的“查询”:DNS 查找和 HTTP 请求。HTTP 请求使用 DNS 查找 - 但并非总是如此。例如,服务器可以位于本地网络上,您可以使用/etc/hosts
文件中的 IP 地址和名称信息向其请求页面。链接名称可能并不总是包含主机名部分,因为它们可以是相对的(这通常是使网站能够轻松移动到反向代理后面或主机名更改的好习惯。
考虑到这种区别,您的问题的要点 - 您是否可以检查 URI 的正确性链接与真正丢失的 aa 页面 ( 404
) 是合理的 - 但 DNS 查询是否google/com
应该成功。您的应用程序是否被代理重定向到搜索页面?
下面是一个粗略的近似答案——这可能不会有太大用处,但你会明白的。对于 中更有用的方法perl
,您可能需要检查一些功能更强大的 perl 框架 ( Catalyst
Mojo
) 是否具有执行此操作的方法。此外,如果您正在为您的前端 UI(即javascript
在网页上)执行此操作,则可能存在更快或更简单的成熟方法。以下步骤看起来像是您想要对每个链接执行的操作:
1 检查链接/URI是否“正常”;如果不打印错误;如果是那么:
2 对链接/URI 的主机部分进行 DNS 查找;如果不打印错误;如果成功则:
3 尝试获取网页并打印任何错误,或者如果成功则说明
但是,衡量“成功”很难自动化:是否应该将其严格定义为状态“200 OK”?也许您或其他成员可以添加该部分并找到一种优雅的方式来阅读“链接”(损坏或其他)。
该脚本草率地使用our
来存储东西,并且不会与use strict
. 请有人让它看起来更好,并且只使用 CORE:: modules :-)
use Regexp::Common qw/URI/;
use Net::DNS;
use 5.10.0;
use LWP::UserAgent;
my $url = "http://www.google.com/adsfdsa" ;
my $lookup = Net::DNS::Resolver->new;
my $ua = LWP::UserAgent->new;
### Step 0. regexp the URI ##
if ($url =~ /$RE{URI}{HTTP}{-keep}/){
say "$url is a URI ";
our $hostpart = $3; # stash the host part as per man page
our $filepart = $5; # stash the path
}
### Step 1. do a DNS look up and if it succeeds then or else ... etc. ###
if ($lookup->query($hostpart)) { say "$hostpart is a valid host" }
else { say " but $hostpart is an invalid host" }
### Step 2. fetch the page and check the return code ###
my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);
if ($response->is_success || $response->is_redirect ) {
print $request->content;
}
else {
say "but $filepart is an invalid path";
}
输出:
http://www.google.com/adsfdsa is a URI
www.google.com is a valid host
but /adsfdsa is an invalid path
您可以从您的输入中读取类似上述内容(但更短、更优雅、更高效!),并将适当的消息返回给您的用户,即从错误发生的地方:即在步骤 0.、1 或 2.)。请注意,可能有更快、更简单的方法来做到这一点,但是模块喜欢Regexp::Common
并且LWP
经过很好的练习和测试。