这个问题是关于控制一个页面可以在哪个站点框架化的。
我想使用接受的答案,但是当点击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则不会加载所以你需要