允许一个页面被框架化,但不允许它在自己的页面上显示


Allow a page to be iframed, but disallow it displaying on it's own

这个问题是关于控制一个页面可以在哪个站点框架化的。

我想使用接受的答案,但是当点击iframe内的链接时,referrer随后被报告为承载框架内容的域。如果网站不在框架内,服务器端是否有阻止网站显示的方法?(apache, php5)

这是我想要达到的目标:

我的服务器生成一些内容。我们希望与特定的其他网站分享这些内容。我们不希望该内容单独显示。如果可能的话,我不想依赖客户端脚本,因为它可以被关闭。(将主体标记或主包装器div设置为display: none并没有真正帮助,因为内容仍然存在,在源代码中。)

PHP不可能知道请求是否来自iframe内部,因为它将具有与顶部窗口完全相同的表单。

为什么不能使用include ?在这种情况下,有一个简单的解决方案:

if (strcmp(basename($_SERVER['SCRIPT_NAME']), basename(__FILE__)) === 0){
    header("location: index.php");
}
编辑:

我想说的是,使用iframes,你不能控制服务器端的访问。

让我们假设你有你的主页index.php和页面是框架,如foo.php

当您执行<iframe src="foo.php"></iframe>时,向服务器发出一个新的HTTP请求,它几乎与index.php的请求相同。

使用include,您只有一个请求。PHP服务器解析的请求的参数之一是脚本名称。当您执行:GET /index.php HTT/1.1时,脚本名称将变为index.php

把我给你看的代码放在包含的文件中会防止它们被直接访问,你可以通过include引用它们。

我不认为服务器(或服务器端代码)可能知道页面是否显示在iframe内。服务器处理页面请求,不知道表示。

我认为最接近的服务器端解决方案(在PHP中)是检查$SERVER['HTTP_REFERER']

如果您必须将对脚本的访问限制在一个框架内,您将需要在客户端上可以检查演示文稿的东西。在javascript中有几个解决方案在这里和这里

我遇到了同样的问题:

$ref = $_SERVER['HTTP_REFERER'];
if($ref == '') {
exit;
}

iframe的referer是父窗口的url所以如果要构建iframe的页面没有referer则不会加载所以你需要

相关文章: