0

我在名为 login.php 的文件中有以下 PHP 脚本

<?php
$ref = $_SERVER['HTTP_REFERER'];
if ($ref == 'http://example.com/dir/invalid.php' || $ref == 'http://www.example.com /dir/invalid.php') {
echo '
     <div id="invalid">
         TESTTESTTESTTESTTESTTESTTESTTEST
     </div>
    ';
}
?>

我故意去了 invalid.php 页面(它使用 header() 重定向到 login.php)并且这个 div 没有出现。是否与引荐来源网址实际上不是 invalid.php 或脚本有问题有关?

谢谢

4

1 回答 1

1

我不认为这HTTP_REFERER是你认为的那样。即,它是用户从其跟随到当前页面的链接的页面。但是,它非常不可靠,因为我们依赖用户的浏览器来正确报告这个值。

我会建议我认为你需要的选项,除了我能想到的唯一一个可能没有意义......(检查网址是否与不是当前脚本的网址匹配)......所以我做了看不到您要做什么。


正如承诺的那样,有几种方法可以实现您想要实现的目标:

首先,我根本不喜欢这个解决方案,并且真的认为它很丑,但它是最接近你想要做的事情的解决方案。

无效的.php

require 'login.php'; // we include the file instead of referring to it

登录.php

if ($_SERVER['SCRIPT_NAME'] == 'invalid.php')
{
    // do whatever
}

您所做的与我为用户所做的主要区别在于,此处的 url 栏将显示您位于 invalid.php 而不是其他地方。这也意味着刷新不会使消息消失。

我认为更好的解决方案如下:

在您登录用户的脚本中(检查数据库和所有内容):

if (!valid_login()) // pseudo-code, obviously
{
    $_SESSION['invalid_login'] = true;
    header('Location: login.php');
    // previously, we had something like this instead of the two lines above:
    // header('Location: invalid.php');
}

在 login.php 中

if (isset($_SESSION['invalid_login']) && $_SESSION['invalid_login'])
{
    $_SESSION['invalid_login'] = false;

    // do whatever
}

当然,这应该通过适当的会话设施来完成,例如在这两个文件中启动会话。您可以不使用会话变量,而是包含文件并使用普通变量或通过标头请求发送 GET 变量,但这两种解决方案都有一个问题:刷新不会使消息消失。但是,如果您要将代码从上面两个文件的顶部文件移动到login.php(如果它不存在,我不知道实际上是什么文件......)您可以再次使用普通变量而不是会话变量并有一个解决方案,其中刷新确实可以让它消失。在这种情况下,您可能会争辩说您的文件中包含业务逻辑和演示文稿,但有一些解决方案(例如将其保存在单独的文件中,并将其包含在login.php,将 html 移动到另一个文件,并将该文件包含在其中login.php或两者中。

于 2012-10-29T22:50:51.020 回答