我需要知道一个人是否从我网站内的链接进入我的网站,而不是外部网站。更确切地说,链接需要类似于
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
}
答案 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;
你的第二个选择是依赖于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'];
}
现在有了这个例子你可以玩,你可以把它作为一个数组,以获得更多的历史事件等。