拒绝在框架中显示,因为它将 'X-Frame-Options' 设置为 'SAMEORIGIN'。

359
我正在开发一个网站,应该是响应式的,这样人们可以从手机上访问它。该网站有一些安全部分,可以使用Google、Facebook等登录(OAuth)。
服务器后端使用ASP.NET Web API 2开发,前端主要是AngularJS和一些Razor。
对于认证部分,在所有浏览器中,包括Android,一切都正常工作,但是在iPhone上Google认证不起作用,并且给我显示了这个错误消息:
Refused to display 'https://accounts.google.com/o/openid2/auth
?openid.ns=http://specs.openid.ne…tp://axschema.org/namePerson
/last&openid.ax.required=email,name,first,last'
in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

就我个人而言,我在我的HTML文件中没有使用任何iframe。
我在网上搜索了一下,但没有找到解决这个问题的答案。

即使在第一眼看不到的情况下,有些你连接到的服务仍然会使用iframes。 - NoWomenNoCry
20个回答

2

有点晚了,但是如果您使用本地应用程序客户端ID而不是Web应用程序客户端ID,则也可能导致此错误。


你是什么意思?我也注意到在Safari窗口中可以工作,但在应用程序的Webview的iframe中无法工作,但如何更改这个问题? - NoBugs
我的问题类似,当我制作网页应用程序客户端ID时,我没有在两个部分中包含我的网站URI。在Google开发者控制台创建客户端ID时,请确保将它们放在那里。 - Phylliida

2

如果你正在使用iframe来嵌入Google Docs Viewer,请将iframe标签更改为以下内容:

iframe src="https://docs.google.com/viewer?url=' + url_your_document + '&embedded=true"

这对我很有效。


1

我测试了所有项目,但这段代码帮了我:

       ?rs:embed=true

例如,我想在我的应用程序中加载一个pbix。我使用以下代码:
   <iframe id="pageIFrame" class="iFrame" src="http://MyServer/ReportS/powerbi/Test?rs:embed=true"></iframe>

它能够正常工作。


1
在Apache上,您需要编辑security.conf文件:
nano /etc/apache2/conf-enabled/security.conf

并设置:

Header set X-Frame-Options: "sameorigin"

然后启用mod_headers:
cd /etc/apache2/mods-enabled

ln -s ../mods-available/headers.load headers.load

并重新启动Apache:

service apache2 restart

就是这样!


0
感谢您的提问。 对于YouTube iframe,第一个问题是您提供的URL是嵌入式URL还是地址栏中的链接。 这个错误是针对非嵌入式URL的,但如果您想提供非嵌入式URL,则需要在“安全管道”中编写代码(适用于非嵌入式或嵌入式URL):
import {Pipe, PipeTransform} from '@angular/core';
import {DomSanitizer} from '@angular/platform-browser';

@Pipe({name: 'safe'})
export class SafePipe implements PipeTransform {

constructor(private sanitizer: DomSanitizer) {

}

transform(value: any, url: any): any {
    if (value && !url) {
        const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
        let match = value.match(regExp);
        if (match && match[2].length == 11) {
            console.log(match[2]);
            let sepratedID = match[2];
            let embedUrl = '//www.youtube.com/embed/' + sepratedID;
            return this.sanitizer.bypassSecurityTrustResourceUrl(embedUrl);
        }

     }

   }
}

它将拆分出"vedioId"。您需要获取视频ID,然后将其设置为嵌入式URL。 在HTML中

 <div>
   <iframe width="100%" height="300" [src]="video.url | safe"></iframe>
 </div>

Angular 2/5 感谢您再次使用我们的服务。


非常好的解决方案。谢谢。 - Stefani Toto
"vedioId": 你是不是指的是*"videoId"*? - undefined
好的,楼主已经离开了;“最后一次出现是在4年前”。也许其他人可以参与讨论? - undefined

0

这里是我在 Iframe 中使用并成功显示的代码,我正在使用 C# 的 cshtml 编写此代码。

@if (item.DisplayValue2 != null)
{
   <div id="collapse_@item.ID" class="collapse" role="tabpanel" aria-labelledby="heading_@item.ID" data-parent="#accordion" style="">
   <div class="card-body">
      @item.DisplayValue1
   </div>
   <br /> <br />
   @{
       var url = item.DisplayValue2.Replace("watch?v=", "embed/");
     }
    <iframe width="560" height="315" src=@url frameborder="0" allowfullscreen                            style="margin-bottom: 25px; margin-left: 25px;">   
   </iframe></div>

0
在URL后缀中添加以下内容。
/override-http-headers-default-settings-x-frame-options

@NickDimou 试试这个 https://www.linkedin.com/pulse/working-iframe-angular-thiago-adriano/ - Arul

-1
在使用iframe注销具有不同域的子站点时,遇到了类似的问题。我使用的解决方案是先加载iframe,然后在框架加载后更新源。

var frame = document.createElement('iframe');
frame.style.display = 'none';
frame.setAttribute('src', 'about:blank');
document.body.appendChild(frame);
frame.addEventListener('load', () => {
  frame.setAttribute('src', url);
});



-2

我曾经遇到过类似的问题,嵌入YouTube聊天时出现了问题,但我解决了。也许有类似问题的解决方案。

Refused to display 'https://www.youtube.com/live_chat?v=yDc9BonIXXI&embed_domain=your.domain.web' in a frame because it set 'X-Frame-Options' to 'sameorigin'

我的网页可以在带有www和不带www的情况下正常工作。因此,为了使其正常工作,您需要确保加载embed_domain=值所列出的那个。也许有一个变量你错过了,告诉你在哪里嵌入你的iframe。为了解决我的问题,我不得不编写一个脚本来检测正确的网页并执行适当的iframe嵌入域名。
<iframe src='https://www.youtube.com/live_chat?v=yDc9BonIXXI&embed_domain=your.domain.web' width="100%" height="600" frameborder='no' scrolling='no'></iframe>

or

<iframe src='https://www.youtube.com/live_chat?v=yDc9BonIXXI&embed_domain=www.your.domain.web' width="100%" height="600" frameborder='no' scrolling='no'></iframe>

了解您不使用iframe,但仍然可能需要添加一些变量到您的语法中,告诉它脚本将在哪里使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接