Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要知道是否有人从我网站内部的链接而不是外部网站访问我的网站_Php_Http Referer - Fatal编程技术网

Php 需要知道是否有人从我网站内部的链接而不是外部网站访问我的网站

Php 需要知道是否有人从我网站内部的链接而不是外部网站访问我的网站,php,http-referer,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是

我需要知道是否有人从我网站内部的链接而不是外部网站访问我的网站。更准确地说,链接需要类似于

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”,并且它是一个内部链接(来自我的实时主机或localhost)

以下是我到目前为止所做的

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

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

}

实现这一点的最佳方法是在内部url中附加一个随机标记,并检查接收url是否匹配。有很多方法可以做到这一点,最常见的方法是将值存储在sesson或数据库中,并将其附加到url中,然后根据接收端存储的令牌检查url令牌的值

 somelink.com?token=$yourRandomToken

实现这一点的最佳方法是在内部url中附加一个随机标记,并检查接收url是否匹配。有很多方法可以做到这一点,最常见的方法是将值存储在sesson或数据库中,并将其附加到url中,然后根据接收端存储的令牌检查url令牌的值

 somelink.com?token=$yourRandomToken
试试这个

$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,将在$matches[0]中显示

或者

其中,
$matches[0]
是主机,
$matches[1]
现在是“library/cat”或“library/publication”

在一个像这样的网站上查看并测试这些模式。

试试这个

$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,将在$matches[0]中显示

或者

其中,
$matches[0]
是主机,
$matches[1]
现在是“library/cat”或“library/publication”


在类似这样的网站上亲自查看并测试这些模式。

事实上,您的分析是可以的,但请记住,收集任何外部数据都不可靠,而且容易受到黑客攻击

使用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

}
但如果你真的想给用户一个“返回”按钮,你有更好的解决方案:

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

函数goBack(){
window.history.go(-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

}
但如果你真的想给用户一个“返回”按钮,你有更好的解决方案:

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

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

返回
这是(有时)检测“来自外部”访问的唯一方法,而且它远不可靠。不是所有的浏览器都会发送推荐信,也不是所有的浏览器都会发送有效/真实的推荐信,等等。我编辑了我的原始帖子,所以这是一个问题,不是一个声明。我会支持Marc B,推荐信不可靠,我会阻止你使用这种方法。我理解可靠性问题。但就我而言,这根本不是结果。如果url匹配,那么我会显示一个返回到url的按钮,如果不匹配,或者如果referer不存在,或者其他,我不会显示任何内容。在最坏的情况下,不会显示任何内容。这是(有时)您可以检测“来自外部”访问的唯一方法,而且它远不可靠。不是所有的浏览器都会发送推荐信,也不是所有的浏览器都会发送有效/真实的推荐信,等等。我编辑了我的原始帖子,所以这是一个问题,不是一个声明。我会支持Marc B,推荐信不可靠,我会阻止你使用这种方法。我理解可靠性问题。但就我而言,这根本不是结果。如果url匹配,那么我会显示一个返回到url的按钮,如果不匹配,或者如果referer不存在,或者其他,我不会显示任何内容。最坏的情况是,不会显示任何内容。此方法类似于laravel提供的CSFR令牌,您可能会研究laravel或CSFR方法。此方法类似于laravel提供的CSFR令牌,您可能会研究laravel或CSFR方法。我非常喜欢JS解决方案!它把你带回到原来的地方,那就更好了。也许我也应该测试推荐人的域名,这样我就不会发送回搜索引擎了。正如我在前面的评论中所说的,最坏的情况是,如果不满足条件,我根本就不展示任何东西。我非常喜欢JS解决方案!它把你带回到原来的地方,那就更好了。也许我也应该测试推荐人的域名,这样我就不会发送回搜索引擎了。正如我在前面的评论中所说的,最坏的情况是,如果条件不满足,我根本就不会展示任何东西。