使用PHP规范化uri部分给定的基本URL

时间:2010-06-20 12:46:46

标签: php url normalization web-crawler

首先,我正在为一个网络爬虫(又名蜘蛛又蠕虫......)做这个。

给定两个字符串(基本网址和相对网址),我需要确定绝对网址。 当涉及到“SEO友好”废话时,尤其令人困惑,例如:

基本网址:http://aaa.com/january/15/test 找到网址:/test.php?aaa

我怎么知道以上不是文件夹? 例如;绝对路径是:

  

http://aaa.com/january/15/test/test.php?aaa

或者:

  

http://aaa.com/january/15/test.php?aaa

混淆源于是否有一个指数在起作用。 “/test/index.php”或“/index.php”?

1 个答案:

答案 0 :(得分:1)

您只能通过检查网址来解决此问题。

您说您需要一个基本URL和相对URL的绝对URL。完整URL是基本URL和相对URL的串联。正如你所见,知道这一点并没有帮助。

http://example.com/directory/index.phphttp://example.com/directory/可以合法地引用两种不同的资源。

http://example.com/directory/index.phphttp://example.com/directory/foo/bar/baz.php可以合法地引用相同的最终资源。

在上面的第二个例子中,哪个是规范网址?这不是必须通过计算确定的东西。规范网址是您选择作为规范网址的网址。

你实际上面临两个问题:

  1. 两个不同的URL何时引用相同的资源?
  2. 哪个网址是规范网址?
  3. <强> 1。两个不同的URL何时引用相同的资源?

    无法通过任何方式比较网址来确定。这只能通过比较资源本身,即内容和HTTP标头来确定。

    ETag - http://en.wikipedia.org/wiki/HTTP_ETag

    简而言之,ETag是一个HTTP标头,对于资源是唯一的。其目的是进行缓存验证,即我的缓存中的内容是否与http://example.com/content中的内容相同?

    两个相同的资源(至少来自同一主机)将具有相同的ETag标头值。如果可能,请使用此选项(并非所有Web服务器都将返回ETag标头)。

    HTTP标头和内容比较

    两个资源何时相同?当内容类型和内容相同时。

    使用Content-Type标头比较内容类型。比较内容本身就是字符串比较的简单情况。

    如果您要存储以前找到的资源的属性并将这些资源与新发现的资源进行比较,则无需考虑资源的全文以进行比较 - 哈希就可以了。

    就PHP而言,HTTP extension将通过非常方便的OO API为您提供所需的一切,用于检查HTTP标头和资源的完整内容。 md5()函数是生成唯一哈希的一种选择。还有其他人。

    <强> 2。哪个网址是规范网址?

    选择一个并坚持下去。默认情况下,对于同一资源,一个URL不再是另一个URL的规范。为简单起见,您可以将最短的两个URL视为规范形式。