【问题标题】:Check if site is inside iframe检查网站是否在 iframe 内
【发布时间】:2011-07-12 10:11:15
【问题描述】:

任何人都知道是否可以使用 PHP 检查网站是否在 iframe 中。

我知道使用 javascript 是可能的,但我找不到任何使用 PHP 的示例?

【问题讨论】:

    标签: php iframe


    【解决方案1】:

    PHP 从不在 iframe 中。 PHP 在服务器端执行并生成 HTML、Javascript 或文本等输出。 PHP 生成的输出可能会生成或驻留在 iframe 中,但绝不会 PHP 本身。


    附加细节

    关于您在 cmets 中添加的其他详细信息(您希望区分直接向您的站点发出的请求和通过 Facebook 应用程序发出的请求),您可以使用一些技术:

    1. $_SERVER['HTTP_REFERER']:

    您可以检查引荐来源网址以确定请求是来自 Facebook URL、来自您自己网站上的另一个页面、来自第三方网站还是直接流量。此方法并非万无一失,但可能会提供比您的应用程序当前接收到的更多信息。

    1. 单独的网址

    您可以为在您的站点上运行的应用程序和 Facebook 版本创建单独的 URL。使用$_SERVER['REQUEST_URI'],您可以轻松检测您的应用程序是通过“yoursite.com/fbapp”还是“yoursite.com/localapp”访问的。两个 URL 都可以通过 Apache 的 mod_rewrite 或您选择的别名解决方案引用相同的脚本。

    1. 网址参数

    这种方法可能是最容易实现的。如果您在向 Facebook 提供应用程序 URL 时可以提供 URL 参数,只需添加一个参数即可。例如:

    ?access_method=facebook
    

    在 PHP 中,您可以轻松检查 access_method 参数的存在和值,并根据需要采取措施。

    【讨论】:

      【解决方案2】:

      对于登陆这个旧线程的任何人:有一种非常简单的方法可以检查 PHP 是否通过 iframe 加载了您的页面。

      if( isset($_SERVER['HTTP_SEC_FETCH_DEST']) && $_SERVER['HTTP_SEC_FETCH_DEST'] == 'iframe' ) {}
      

      【讨论】:

      • 很好的解决方案!与我不希望脚本在 iFrame 中排队的 Wordpress 插件完美配合。谢谢。
      • 我找不到 iframe 是此字段的有效值的文档,我也无法在 sec-fetch-dest 标头上找到太多其他内容。你有关于它是如何工作的链接或资源吗?每个浏览器都支持吗?在 chrome 中工作,完全符合我的需要,但只是想澄清一下它对浏览器的支持。
      • Geilt,我也找不到任何相关信息。所以我只是开始比较所有 $_SERVER 有和没有 iFrame,通过代理,或直接,使用是/否 Adguard(和类似的)。很多 $_SERVER 变量在哪里有其他值。唯一总是在 iFrame 中向我们展示的(无论连接如何)是 $_SERVER['HTTP_SEC_FETCH_DEST']。
      • IE、Firefox 和 Safari 不支持此标头 - developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
      • @Ismail 仅支持 Firefox 90 以上和 chrome.. safari 不支持。只使用window.location..啊..
      【解决方案3】:

      不,PHP 是服务器端。它无法知道它是否在 iframe 中。

      【讨论】:

      • 感谢您的回答。这是因为人们可以通过使用我的应用程序。 facebook 应用程序或直接在浏览器中。因此,如果用户在我在 facebook 上的应用程序上,则链接应该有所不同,而不是用户直接在浏览器中而不是通过 facebook 上我的网站。知道我该怎么做吗?
      • @Simon 这里的方法是使用 javascript 检查页面是否加载到 iframe 中。在此处阅读更多信息:24hourapps.com/2009/01/…
      • @Ancide 它需要使用某种 PHP
      • @Simon 抱歉,在 PHP 中无法获得快速、直接和准确的解决方案。最佳做法是使用 javascript 来处理。
      • @Ancide yearh,这有点烦人
      【解决方案4】:
      <?php
      if(!$_SERVER['HTTP_REFERER'] == 'YourFrameURL') {
          // Site is NOT loaded from iframe
          die('Please load this page from YourFrameURL');
      }
      else {
          // Site IS loaded from iframe: display content
      ?>
      

      请注意$_SERVER['HTTP_REFERER'] 完全不可靠:它可以被修改。另请注意,此方法是“https 敏感”的。如果框架是从https://x 加载的,而YourFrameURL 设置为http://x,它将不起作用。使用以下方法解决此问题:

      if(!$_SERVER['HTTP_REFERER'] == 'http://YourFrameURL' or !$_SERVER['HTTP_REFERER'] == 'https://YourFrameURL') {
      

      【讨论】:

      • 实际上是:if(isset($_SERVER['HTTP_REFERER']) &amp;&amp; $_SERVER['HTTP_REFERER'] != 'http://YourFrameURL') { } checkign 是否设置了referer 并且与您的网址不同
      【解决方案5】:

      您可以查看$_SERVER['HTTP_REFERER']。这不能真正被信任,因为浏览器并不总是提供这些信息。此外,HTTP_REFERER 并不总是意味着 iframe,但对于特定情况,这很好。

      【讨论】:

      • $_SERVER['HTTP_REFERER'] 在 facebook 上输出正确的 url,但在我的网站上直接通过浏览器,我收到此错误:未定义索引:HTTP_REFERER
      • $_SERVER['HTTP_REFERER'] 直接访问网站时没有设置。你可以用这个来测试它:if (isset($_SERVER['HTTP_REFERER'])) { ... }.
      • 看起来该解决方案有效。我将在 IE 中测试它并返回! :-)
      • @Simon 另外,我建议检查 HTTP_REFERER 是否是 facebook 中的特定 URL,因为如果其他网站有直接链接到您的网站并且有人来到您的网站,则抛出此链接HTTP_REFERER 将等于用户来自的 URL。
      • 是的,没错。如果我来自 facebook via。一个链接,网址将是apps.facebook.com/application,因为脚本认为我是通过facebook使用应用程序的:s
      【解决方案6】:

      我找到了一个可以用 php + javascript 实现的解决方法。 在你的 iframe 设置参数iframe_view=true 上的第一个 url 上,然后使用这个 js 再次放置这个 url 参数的所有链接

      <script>
      $(function() {
         $("a").attr('href', function(index, item) {
           return item + (item.indexOf('?') != -1 ? "&iframe_view=true" : "?iframe_view=true");
         });
      });
      </script>
      

      然后用 php 像这样读取它:

      if (isset($_GET['iframe_view'])) {
      //iframe view
      }
      

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 2014-01-06
        • 2014-06-29
        • 2018-10-30
        • 2011-03-06
        • 2013-05-22
        • 2015-05-26
        • 1970-01-01
        • 2014-12-25
        相关资源
        最近更新 更多