需要知道一个人是从我网站内的链接进入我的网站,而不是外部网站

时间:2016-09-27 16:02:30

标签: php http-referer

我需要知道一个人是否从我网站内的链接进入我的网站,而不是外部网站。更确切地说,链接需要类似于

http://localhost/library/cat/5/fashion
http://www.mywebpage.com/library/cat/4/design

http://localhost/library/publication/7/pronto
http://www.mywebpage.com/library/publication/7/pronto

我如何确定HTTP_REFERER是否至少包含'library / cat'或'library / publication',它是一个内部链接(来自我的直播主机或本地主机)?

这是我到目前为止所做的事情

if ( isset($_SERVER['HTTP_REFERER') ) {

    //if the referer contains something that resembles the above url's, add icon to go back

}

3 个答案:

答案 0 :(得分:1)

实现此目的的最佳方法是将随机令牌附加到您的内部网址,并检查接收网址上的匹配项。有很多方法可以做到这一点,除了将值附加到您的URL之外,最常将值存储在sesson或数据库中,然后根据接收端上存储的令牌检查url令牌的值。

 somelink.com?token=$yourRandomToken

答案 1 :(得分:1)

试试这个......

$subject = $_SERVER['HTTP_REFERER');
$pattern1 = '/^http:\/\/([\w.]*)\/library\/cat\//';
$pattern2 = '/^http:\/\/([\w.]*)\/library\/publication\//';

if( 1 == preg_match($pattern1, $subject, $matches) or 1 == preg_match($pattern2, $subject, $matches) ){
    // Do stuff
}

如果您需要知道它的本地主机或www.mywebpage.com是否会在$ match [0]中。

或者...

$subject = $_SERVER['HTTP_REFERER');
$pattern = '/^http:\/\/([\w.]*)\/(library\/cat|library\/publication)\//';
if( 1 == preg_match($pattern, $subject, $matches) ){
    // Do stuff
}

$matches[0]是主持人,$matches[1]现在是" library / cat"或"图书馆/出版物"。

查看preg_match并在this等网站上自行测试模式。

答案 2 :(得分:1)

实际上你的方法还可以,但是在开采时要注意,任何外部数据都不可靠且容易产生黑客攻击。

使用HTTP_REFERER,这就是我要做的事情:

if ( !empty($_SERVER['HTTP_REFERER']) && strpos(strtolower($_SERVER['HTTP_REFERER']), '/library/cat/' ) !== false ) {

//if the referer contains something that resembles the above url's, add icon to go back

}

但如果你真的想给用户一个" Go Back"按钮,你有更好的解决方案:

在JS中使用简单历史记录(-1),您可以将用户发送回他来自的搜索引擎:



function goBack() {
    window.history.go(-1);
}

<button onclick="goBack()">Go Back</button>
&#13;
&#13;
&#13;

你的第二个选择是依赖于Cookies,这有点复杂,但会给你一个主要的想法         

if (empty($_SESSION['current_page'])){
    // This is our first page in this website!
    $_SESSION['current_page'] = $_SERVER['REQUEST_URI'];
} else {
    // This is our second+ page in this website, we have a back button
    $_SESSION['prev_page'] = $_SESSION['current_page'];
    $_SESSION['current_page'] = $_SERVER['REQUEST_URI'];
}

现在有了这个例子你可以玩,你可以把它作为一个数组,以获得更多的历史事件等。