'X-Frame-Options'를 'SAMEORIGIN'으로 설정하여 프레임에 표시하지 않습니다.


272

사람들이 휴대 전화에서 웹 사이트에 액세스 할 수 있도록 반응 형 웹 사이트를 개발 중입니다. 이 사이트에는 Google, Facebook 등 ... (OAuth)을 사용하여 로그인 할 수있는 보안 부분이 있습니다.

서버 백엔드는 ASP.Net Web API 2를 사용하여 개발되었으며 프론트 엔드는 주로 일부 Razor가있는 AngularJS입니다.

인증 부분의 경우 Android를 포함한 모든 브라우저에서 모든 것이 잘 작동하지만 Google 인증은 iPhone에서 작동하지 않으며이 오류 메시지가 표시됩니다

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을 사용하지 않는 것이 좋습니다.

나는 주변을 둘러 보았지만 아무런 문제도 해결하지 못했습니다.


iframe은 때때로 보이지 않는 경우에도 연결 서비스에 의해 사용됩니다 (첫눈에)
NoWomenNoCry

답변:


171

나는 어쩌면 누군가가 대신 할 수 있습니다, 더 나은 솔루션을 발견 "watch?v="하여 "v/"그것을 작동합니다

var url = url.replace("watch?v=", "v/");

51
전체 URL이 될 것입니다, 그래서 당신은 또한 "/ V"대신 "/ 포함"그 사용 변경할 수 있습니다 :<iframe width='1080' height='760' src="https://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" allowfullscreen></iframe>
backwardm

1
나는이 대답 변경하는 것이 좋습니다 "내장을 /", "V /"더 이상 작동하지 않습니다 때문에
tm81

88

이 SO 포스트의 도움으로 이것에 더 많은 시간을 보낸 후 OK

"X-Frame-Options에 의해 금지 된 디스플레이"극복

&output=embedGoogle URL에 게시하기 전에 URL 끝에 추가하여 문제를 해결했습니다 .

var url = data.url + "&output=embed";
window.location.replace(url);

1
실제로 이것은 원래 게시물에서 언급 한 바와 같이 OAUTH를위한 것입니다. 여전히 OAUTH 2.0에서 작동합니다. Google은 서비스를 사용하도록 설정을 변경했지만 이제는 OAUTH 2.0을 사용하도록 일부 속성을 변경해야하며 이는 OWIN 3.0 미들웨어의 경우입니다. "access_denied"오류 메시지가 표시되면이 링크를 참조하십시오. blogs.msdn.com/b/webdev/archive/2014/07/02/…
Ali Hmer

1
@AliHmer 고마워 친구. 당신은 내 하루를 저장 :) & output = embed는 나를 위해 매력처럼 작동했습니다 .. :)
Sahil Manchanda

1
앱 웹보기의 Google 캘린더 iframe에서도 작동하지 않습니다.
NoBugs


35

이 경우 헤더를 SAMEORIGIN으로 설정했습니다. 즉, 도메인 외부의 iframe에 리소스를로드 할 수 없습니다. 따라서이 iframe은 교차 도메인을 표시 할 수 없습니다

여기에 이미지 설명을 입력하십시오

이를 위해서는 아파치 또는 사용중인 다른 서비스의 위치와 일치해야합니다.

아파치를 사용하는 경우 httpd.conf 파일에서.

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>

2
무엇입니까 your_relative_path?
Green

2
your_relative_path 란 무엇입니까?
Sobiaholic


11

angularjs 페이지에 YouTube 비디오를 포함 시키려면 간단히 비디오에 다음 필터를 사용할 수 있습니다

app.filter('scrurl', function($sce) {
    return function(text) {
        text = text.replace("watch?v=", "embed/");
        return $sce.trustAsResourceUrl(text);
    };
});
<iframe class="ytplayer" type="text/html" width="100%" height="360" src="{{youtube_url | scrurl}}" frameborder="0"></iframe>


7

아래 변경 사항을 수행하고 잘 작동합니다.

속성을 추가하십시오 <iframe src="URL" target="_parent" />

_parent: 이것은 같은 창에 포함 된 페이지를 엽니 다.

_blank: 다른 탭에서


1
나는 원래의 질문에 대한 답이 얼마나 적절한 지 모르겠지만, 제 경우에는 다른 맥락에서 해결책을 제공했습니다
Éric Viala

4

나를 위해 수정은 console.developer.google.com으로 이동하여 OAuth 2 자격 증명의 "자바 스크립트 출처"섹션에 애플리케이션 도메인을 추가했습니다.


2

조금 늦었지만을 native application Client ID대신 사용하면이 오류가 발생할 수도 있습니다 web application Client ID.


무슨 소리 야? 또한 프레임이 Safari 창에서 작동하지만 앱의 웹보기 iframe에서는 작동하지 않지만 어떻게 변경합니까?
NoBugs

내 문제는 유사했다, 클라이언트 ID 난 당신이 그들에게 구글 개발자 콘솔에서 클라이언트 ID가 만들 때 넣어 두 절에서 내 웹 사이트의 URI를 포함하지 않았다 웹 응용 프로그램을 만들 때
Phylliida

2

Angular 9에서 구현하는 것과 동일한 문제가 발생했습니다.이 두 단계는 다음과 같습니다.

  1. YouTube URL을에서 (으) https://youtube.com/your_code로 변경하십시오 https://youtube.com/embed/your_code.

  2. 그런 다음 DomSanitizerAngular를 통해 URL을 전달하십시오 .

    import { Component, OnInit } from "@angular/core";
    import { DomSanitizer } from '@angular/platform-browser';
    
    @Component({
      selector: "app-help",
      templateUrl: "./help.component.html",
      styleUrls: ["./help.component.scss"],
    })
    export class HelpComponent implements OnInit {
    
      youtubeVideoLink: any = 'https://youtube.com/embed/your_code'
    
      constructor(public sanitizer: DomSanitizer) {
        this.sanitizer = sanitizer;   
      }
    
      ngOnInit(): void {}
    
      getLink(){
        return this.sanitizer.bypassSecurityTrustResourceUrl(this.youtubeVideoLink);
      }
    
    }
    <iframe width="420" height="315" [src]="getLink()" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

1

부모를 참조하여 나를 위해 일한 해결책이 있습니다. Google 인증 페이지로 리디렉션되는 URL을 얻은 후 다음 코드를 시도 할 수 있습니다.

var loc = redirect_location;      
window.parent.location.replace(loc);

0

질문 주셔서 감사합니다. YouTube iframe의 첫 번째 문제는 사용자가 제공 한 URL이며 주소 표시 줄의 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>

다시 각도 2/5 감사합니다.


0

URL 접미사로 아래를 추가하십시오.

/override-http-headers-default-settings-x-frame-options

0

유튜브 채팅을 포함시키는 비슷한 문제가 있었고 알아 냈습니다. 비슷한 문제에 대한 비슷한 해결책이있을 수 있습니다.

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와 함께 작동합니다. 따라서 작동하려면 embed_domain = value 에 나열된 값 을로드해야합니다 . 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>

또는

<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을 사용하고 있지는 않지만 스크립트를 사용할 위치를 알려주기 위해 구문에 추가해야 할 변수가있을 수 있습니다.


-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);
});


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.