HTTP_REFERER启动HTML可见整个网站不仅仅在最初的登陆页面

HTTP_REFERER启动HTML可见整个网站不仅仅在最初的登陆页面

问题描述:

我一直在寻找解决我的问题 - 我不是一个PHP新手,但我没有过多的经验。HTTP_REFERER启动HTML可见整个网站不仅仅在最初的登陆页面

我的问题是这样的:

我有一组网站 - 一个是父站点。我想拥有它,这样如果我只从父站点打到我的任何子站点,则会出现返回到父按钮(用div包裹)。如果我直接或从其他引荐网站点击任何子网站,则该按钮不会出现。

我有这个工作使用HTTP_REFERER,但我希望按钮保持可见,当你点击通过网站(显然引用更改,一旦我开始点击通过该网站)。

这适用于该按钮出现在第一个访问该网站:

<?php if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER'])) { ?> 
<div><a href="http://www.mysite.com/">Back</a></div> 
<?php } ?> 

但正如我说,我想它保持,而我浏览网站 - 我已经看过建立会话,但我无法让这个工作 - 引用者一旦开始导航时总是改变。

我很欣赏这有点含糊,但我已经尝试了很多代码示例,它们似乎都有相同的问题。

任何帮助将不胜感激。

感谢

编辑:在仔细一看,基于会话的方法可能是刚好够本的具体情况,如果只有一个父站点和多个孩子,但没有多的父母!然而,在更复杂的情况下,会话会把你送到地狱,所以我会留下这个答案。

这是不平凡 -

  • ,你可以使用会话来存储所有网页的引荐目标,但如果用户从不同的引荐,打开同一个页面的多个实例会感到困惑,这可用性很差

  • 或发送一个唯一的密钥以及指向正确的“返回”目标的每个请求。 (这也可能是一个base64或URL编码的URL本身,但是这将使得网址看起来是漫长而丑陋......)

后者是一个很干净的做法,而是一个痛苦始终如一地贯彻。

想到另外一个(疯狂且未经测试的)想法,就是使用JavaScript在window.name属性中存储引用者URL的base64编码表示形式。关于这一点的好处是,与cookie不同,它仅为当前窗口存储“返回”目标我不能保证这会起作用,但如果你真的想要这样做,可能值得跟进。

<?php 

session_start(); 

if (!isset($_SESSION["ref"])){ 
    $_SESSION["ref"] = $_SERVER["HTTP_REFERER"]; //record first instance 
} else if (isset($_SERVER["HTTP_REFERER"])){ 
    $ref = $_SERVER["HTTP_REFERER"]; 
    if ($ref != $_SESSION["ref"]){ 
     $_SESSION["ref"] = $ref; // record new ref 
    } 
} 

if ($ref = $_SESSION["ref"]){ 
    echo "<a href=\"$ref\">Back</a> 
} 

但我同意Pekka,你应该使用自定义site_id这是传递,而您浏览您的网站。中继HTTP_REFERER通常是不安全的。如果您从两个子站点访问您的主站点,则使用会话会让您陷入问题,因为会话将仅保留最新的参考。


在我们的其他解决方案中,我们使用get param“current_ref”,其中包含由源站点创建的编码referer url。这个参数是“粘性”的,并且一路传递,所以在任何时候您都可以返回原始网站。也许你最好也实施这样的方法。

+0

正如我在回答中所说的,这种解决方案在这种情况下不起作用。 – jancha

+0

是的。在第二次阅读时,会话可能足以满足OP的具体情况,但可以撤回我的评论和+1 –

+0

此代码似乎最适合/最接近。如果我登录父站点的任何子站点,所有工作都按预期工作(当我导航时,该按钮将出现并保留在站点上)。但是,如果我现在独立导航到儿童网站(IE不是来自我的父母),则链接不会显示在我登录的第一页上(因为它应该),但是一旦我开始浏览时就会显示。 – Darren

那么HTTP_REFERRER确实是当前页面的最后一个引用者,因此您必须在第一次进入该网站时存储和启动一个会话。

会话通常是一个非常简单的题目,应该工作开箱:

session_start(); 
session_regenerate_id(); 
if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER'])) { 
$_SESSION['parentsite'] = true; 
} 

而后面的代码做:

<?php if(isset($_SESSION['parentsite']) && $_SESSION['parentsite'] == true){ ?> 
<div><a href="http://www.mysite.com/">Back</a></div> 
<?php } ?> 

现在如果会话仍然不工作这可能是一个COOKIE问题或服务器配置问题...

+0

如果我有三个选项卡打开相同的网站,但来自不同的推荐人?我讨厌它,当你使用网站的多个实例时(例如浏览分类网站时),网站开始变得有趣。 –

+0

嗯,你没有说你有很多不同的父母,你说你只有一个父母和许多子网站...我不认为除了传递一个额外的参数以允许您跟踪每个页面的呼叫之外,没有任何简单的解决方案,但是如果您计划在“会话重新生成ID”中关于“session_regenerate_id”的部分,则会再次混淆您的会话从一位家长打电话给几个同样的孩子网站...... –

+0

@Matthieu够公平 - 这个*可以*在OP显示的特定情况下工作,你是对的。 (虽然我不是OP) –

只要我看到你的问题,我认为SESSION将是关键。

您可以设置会话cookie,然后测试以查看cookie是否已经存在。

session_start(); 

if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER']) || 
isset($_SESSION['show_back_button'])) 
{ 

    // Set the session value 
    $_SESSION['show_back_button'] = true; 

    echo '<div><a href="http://www.mysite.com/">Back</a></div>'; 
} 
+0

如果你只是提供一个按钮重定向回你的主网站,是否有关系?只要您明确指出链接的位置即可'返回Website.com' – Luke

+0

对不起,我不确定你的意思?我试图让一个按钮只出现在某个网站的引荐者身上,并在我浏览整个网站时出现我在HTML标记中使用它的原因是我必须将它绝对地放在页面上......是你的意思? – Darren

+0

@Darren对不起,似乎其他用户已删除他的评论之前我的。 – Luke