是否仅当用户来自远程主机上的特定页面时才显示内容?

时间:2018-01-02 作者:eLeXeM

我正在尝试实现一些其他线程中讨论的内容(例如here e、 g.),但特定于某个页面引用,而不仅仅是主机。场景:我们在一个外部站点上主持一个测验,并希望向成功完成该测验的用户开放注册。到目前为止,我发现的是s检查主机的解决方案:

$allowedsite = "thequizhost.com"; //allowed site url without http://
$allowedsite2 = "www.thequizhost.com"; //Type allowed domain with www. this time

$referer = $_SERVER[\'HTTP_REFERER\'];

//Check if browser sends referrer url or not
if ($referer == "") { //If not, set referrer as allowed domain
    $domain = $allowedsite;
} else {
    $domain = parse_url($referer); //If yes, parse referrer
}

if($domain[\'host\'] == $allowedsite || $domain[\'host\'] == $allowedsite2) {

    //proceed to allowed page
echo ("OK [signup_form id=\'2\']");

} else {

    //The referrer is not allowed site, we redirect to allowed home page or do something else 
echo ("not OK"); 
}
但这基本上允许任何足够聪明的人在QuizHost上创建一个普通测验。com并在那里放置一个指向我们注册页面的链接。

我需要如何修改上述示例,以便仅当用户来自QuizHost时才显示注册表单。com/ourspecificquick。php?https://www.thequizhost.com/the-quizzes/quizzing.php?title=our-specific-quiz-we-need-to-echek-for&then=some&parameters=wedontneed ?

感谢您提供的一切帮助。干杯-LX

1 个回复
SO网友:WebElaine

$_SERVER[\'HTTP_REFERER\'] 获取您需要的所有信息,而不仅仅是域-因此,您只需深入了解您已经获得的数据。

我建议只设置一个变量,以确保不会将错误粘贴到第二个变量中-可以通过添加“www.”来检查www版本。

您当前的代码会将页面显示给任何直接访问该页面而没有引用者(即通过书签或搜索引擎结果)的人,听起来您只希望成功完成测试的人能够查看页面,因此我还删除了在引用者为空时将域设置为正确域的部分。

您可能需要对此进行一些调整,但它应该为您指明正确的方向:

<?php
// set the non-www allowed domain, path, and title
$allowedDomain = \'thequizhost.com\';
$allowedPath = \'/the-quizzes/quizzing.php\'
$allowedQuery = \'our-specific-quiz-we-need-to-echek-for\'
// grab the HTTP referer using WP\'s built-in function
$referer = wp_get_referer();
// if referer is not empty
if (!empty($referer)) {
    // split url to check its pieces
    $refererData = parse_url($referer);
    // check domain, both non-www and www
    if($refererData[\'host\'] == $allowedUrl || $refererData[\'host\'] == \'www.\'.$allowedUrl) {
        // check the path
        if($refererData[\'path\'] == $allowedPath) {
            // parse the query string
            parse_str($refererData[\'query\'], $queryString);
            // check just the "title" variable
            if($queryString[\'title\'] == $allowedQuery) {
                // now we know they really completed the quiz
                $showForm = true;
            }
        }
    }
}
// if $showForm is true, they\'ve been verified and can see the form
if($showForm == true) {
    do_shortcode("[signup_form id=\'2\']");
// they didn\'t come from the right place, so don\'t show the form
} else {
    // redirect to homepage, or wherever you like
    wp_safe_redirect(home_url()); exit;
}
?>
如果您认为访问者很有可能在不参加测验的情况下尝试点击页面,而不是重定向,您可以显示其他内容,大意是“感谢您的兴趣。请参加测验(链接此处)以启用注册”

结束