tp6,在iframe里的网址通过获取url参数失败

情况是这样

1 用thinkPHP6 ,index控制器里面的index方法里面 有一个 方法

public function index(){
 $paramdata  = input();
        $inviter = "admin";
        if(empty($paramdata["share"])){}else{
            $inviter = $paramdata["share"];
            cookie('inviter', $paramdata["share"], 259200 );
        }
}

比如我通过访问网址 9.p/index?share=ai01
如果直接访问是可以获取到这个share参数的。

但是 ,通过iframe 这样套一个框架就访问不了。

<iframe id="inlineFrameExample"
    title="Inline Frame Example"
    width="300"
    height="200"
    src="9.p/index/index/index?share=ai01">
</iframe>

这个框架是在另外一个域名下面,比如 8.p 的网站。

打开 8.p的网址, 这个时候,9.p这个网址就获取不到share的参数。
请问这种情况要怎么解决才能 继续 正常获得 share传递的参数。

8.p中iframe加载9.p中网址,服务器端获取参数是没问题的,是不是9.p设置了X-Frame-Options:Deny禁止框架加载了,导致9.p页面没加载

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这个问题的原因是浏览器在跨域的情况下默认不会将跨域iframe的URL参数传递给目标站点。可以采用以下两种方法解决:

1、 通过设置 document.domain 实现同域
在你的 HTML 页面中,可以通过设置 document.domain 来实现两个域名的“同域”,从而让浏览器将 URL 参数传递给目标站点。具体方法如下:

  • 在 8.p 的网站中设置:document.domain = '8.p';
  • 在 9.p 的网站中设置:document.domain = '8.p';

这样,两个站点的 document.domain 都设置为相同的值,浏览器就认为它们处于同一个“域”中,就能够正常传递 URL 参数了。

2、 通过消息传递实现跨域传递参数
在你的 HTML 页面中,可以使用 JavaScript 的 postMessage() 方法实现跨域消息传递。具体方法如下:

在 8.p 的网站中,可以这样设置:

<iframe id="inlineFrameExample"
    title="Inline Frame Example"
    width="300"
    height="200"
    src="9.p/index/index/index">
</iframe>

<script>
var iframe = document.getElementById('inlineFrameExample');
iframe.contentWindow.postMessage('ai01', 'https://9.p');
</script>

在 9.p 的网站中,可以这样设置:

window.addEventListener('message', function(event) {
    if (event.origin !== 'https://8.p') {
        return;
    }
    var inviter = event.data;
    cookie('inviter', inviter, 259200);
}, false);

这样,当 8.p 的网页加载时,会向 9.p 发送一个消息,消息内容为 ai01。当 9.p 的网页收到这个消息时,就会将 inviter 的值设置为 ai01,并存入 cookie 中。这样就实现了跨域传递参数。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

试试这样呢



 <IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php? [L,E=PATH_INFO:$1]
</IfModule>




如果存在iframe的话,可能需要先获取到iframe,然后在去获取url中的参数,例如:

<iframe src="xxxx/controller/action?param=value"></iframe>
<script>
    var ifm = document.getElementById("myFrame");
    var src = ifm.contentWindow.location.href;
    var query = src.split("?")[1];
    var params = query.split("&");
    for (var i = 0; i < params.length; i++) {
        var p = params[i].split("=");
        console.log(p[0] + "=" + p[1]);
    }
</script>

可以通过在链接中添加referer参数解决。referer参数指定了当前页面的来源页面,这样框架页面就可以从referer参数中获取到父页面的url,然后从url中解析出share参数。

根据您的描述,问题可能出现在跨域访问导致无法获取share参数。在跨域场景下,浏览器会遵循同源策略,限制从一个源(域名、协议和端口)向另一个源发送请求。这会导致通过iframe从一个域名(例如8.p)加载的内容无法访问另一个域名(例如9.p)的参数。

为了解决这个问题,可以考虑以下方法:

  1. 跨域资源共享(CORS):在目标服务器(9.p)的响应中设置适当的CORS头,允许来自其他域(例如8.p)的请求访问该资源。具体而言,您可以在响应头中添加Access-Control-Allow-Origin: *,允许来自任何域的请求访问资源。请注意,使用通配符*可能存在安全风险,您也可以将其设置为特定的域名。
  2. 使用代理服务器:在8.p域名下设置一个代理服务器,将对9.p的请求转发到代理服务器上,并将相关参数传递过去。这样,通过8.p域名访问9.p域名时,实际上是通过代理服务器进行请求,从而避免了浏览器的同源策略限制。
  3. 使用URL参数传递:考虑将参数从父页面(8.p)传递到iframe的src属性中。在8.p页面中,构造iframe的src时,将share参数作为查询参数传递给iframe,例如:
<iframe id="inlineFrameExample"
    title="Inline Frame Example"
    width="300"
    height="200"
    src="9.p/index/index/index?share=ai01">
</iframe>

这样,在9.p页面中可以通过获取URL中的查询参数来获取share的值。

请根据您的具体需求选择适合的解决方案,并根据您的开发环境和框架进行相应的配置和调整。