处理URL中的额外“/”

时间:2012-10-25 23:00:01

标签: php

所以我有一个使用此类输入的自定义网站:

example.com/?id=4e2dc982

或者这也可行:

example.com/index.php?id=4e2dc982

但是现在我已经开始在GoogleBot的日志中看到由于某种原因尝试检索这些内容:

example.com/index.php/?id=4e2dc982

更糟糕的是,这实际上有效,它使用正确的GET参数拉取页面,但由于额外的'/',所有链接和引用都不起作用。当它试图加载“image.jpg”而不是加载正确的“example.com/image.jpg”时,它会尝试加载“example.com/index.php/image.jpg”。我该如何最好地解决这个问题?我知道我可以回去替换每个链接以使用绝对路径但这很愚蠢。带有额外“/”的链接不应该起作用。

更新

我找到了修复程序,但仍然不知道为什么甚至允许这样做。我去了:

http://ca1.php.net/manual-lookup.php?pattern=test

并试图查看以下是否可行,并且确定它有效:

http://ca1.php.net/manual-lookup.php/?pattern=test

但是他们的页面没有破坏。所以我看着它,发现了原因:

<base href="http://ca1.php.net/manual-lookup.php" />

所以基本上,任何PHP脚本似乎都接受额外的/,但是如果你没有将所有链接编码为具有绝对路径,或者使用基本标记,那么只要有人添加了额外的'',你的网站就会被搞砸了'/ ”。

2 个答案:

答案 0 :(得分:1)

它必须从某处链接,您需要从哪里找出。您可以使用谷歌网站搜索(即网站:yoursie)来搞清楚。 现在的一个建议是使用规范标签 http://googlewebmastercentral.blogspot.com.au/2009/02/specify-your-canonical.html

答案 1 :(得分:0)

我认为您实际可以做的事情之一是获取标头或浏览器代理(虽然有些浏览器不发送此代码),您可能会这样做。然后,如果标题包含Google之类的内容,请不要让机器人抓取页面,否则会将用户重定向到该网站。 以下是一个例子:

$browser = $_SERVER['HTTP_USER_AGENT'];
checkbrowser($browser); //Calls checkbrowser(); with the browser version.
function checkbrowser($analyze) {
    $searchwords = array("bot","google","crawler");

    $matches = array();
    $matchFound = preg_match_all(
                "/\b(" . implode($searchwords,"|") . ")\b/i", 
                $analyze, 
                $matches
        );

        if ($matchFound) {
            $words = array_unique($matches[0]);
            foreach($words as $word) {
            if($word == "bot") {
                echo "Sorry, bots are not allowed to crawl this specific page.";
                die(); //Terminate the script and leave the bot with that message so it cannot crawl.
            }
        }
    }

}

这就是我经常这样做的方式,但我将这种方法用于不同的事情。您可以通过将$searchwords更改为最适合您的内容来修改该功能。