我希望区分网址中的拼写错误和实际断开的链接。例如:
错字:
www.google/com
断开的链接:
www.thislinkpointstonothing.org
我希望我的应用程序将第一个URL识别为错误形式,并指示第二个URL返回查询时未找到的404。我是否可以使用perl模块或正则表达式进行区分?
我正在尝试区分由于拼写错误导致的错误链接或 - 如果链接遵循RFC - 如果错误链接仅仅是由于页面不再存在。
答案 0 :(得分:0)
您正在谈论两种不同类型的“查询”:DNS查找和HTTP请求。 HTTP请求使用DNS查找 - 但并非总是如此。例如,服务器可以位于本地网络上,您可以使用/etc/hosts
文件中的IP地址和名称信息从中请求页面。链接名称可能并不总是包含主机名部分,因为它们可以是相对的(这通常是一种很好的做法,可以使网站轻松地移动到反向代理之后或者主机名更改。
考虑到这一区别,您的问题的要点 - 是否可以检查URI的正确性与真正缺失的aa页面(404
)的链接是否合理 - 但{{1}的DNS查询应该鼻涕成功。您的应用程序是否被代理重定向到搜索页面?
接下来是一个粗略的近似答案 - 这可能不会有多大用处,但你会得到这个想法。对于google/com
中更有用的方法,您可能想要检查一些更具特色的perl框架(perl
Catalyst
)是否具有执行此操作的方法。此外,如果您为前端UI(即网页上的Mojo
)执行此操作,则可能会有更成熟的方法更快或更简单。以下步骤似乎与您想要对每个链接执行的操作相同:
1检查链接/ URI是否“正常”;如果没有打印错误;如果是的话:
2在链接/ URI的主机部分进行DNS查找;如果没有打印错误;如果成功那么:
3尝试获取网页并打印任何错误,或者如果成功则说明
测量“成功”很难自动化:它应该严格定义为“200 OK”状态吗?也许您或其他成员可以添加该部分,并找到一种优雅的方式来阅读“链接”(破坏或其他)。
此脚本大肆使用javascript
来隐藏内容,而不会使用our
。请有人让它看起来更好,只使用CORE :: modules: - )
use strict
输出:
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";
}
您可以从输入中读取类似上述内容(但更短,更优雅,更高效!)并将相应的消息返回给您的用户,即从错误发生的任何地方返回:即在步骤0,1或2 )。请注意,有可能更快,更简单的方法来执行此操作,但http://www.google.com/adsfdsa is a URI
www.google.com is a valid host
but /adsfdsa is an invalid path
和Regexp::Common
等模块已得到很好的锻炼和测试。