"this content cannot be viewed in a frame" 第一次加载页面时出错

"this content cannot be viewed in a frame" error the first time I load the page

我开发了一个搜索表单,该表单托管在我公司的本地服务器(iis,net core 网站)中。该网站是托管在另一台服务器(apache,wamp)中的 Wordpress,也在公司中。两者都有不同的 public IP,但都托管在同一域的子域下。

比如说,wordpress.company.com 和 search.company.com,我可以控制两者。

我第一次使用 iframe 插件进行测试时,一切似乎都正常,但我现在意识到,Edge 中显示了这个错误。所有浏览器都显示相同的行为,但没有显示类似的消息。

This content can’t be shown in a frame

There is supposed to be some content here, but the publisher doesn’t allow it to be displayed in a frame. This is to help protect the security of any information you might enter into this site.

Try this

Open this in a new window (which is a link to iframes content url)

奇怪的是我只需按 F5 即可正确加载所有内容。

Chrome 控制台中的错误是:

Refused to display 'http://subdomain.mysite.com/' in a frame because it set 'X-Frame-Options' to 'sameorigin'.

如何解决此问题?

该问题与 here 中描述的问题类似,但原因是 .net Core。并且解决方案也类似。

您也可以在问题的评论中使用@user770 所做的建议。但是,这并不能解决 iframe 块。而且这个答案也没有解释为什么刷新页面可以解决问题。然而,这对用户来说并不是一个好的体验。

因此,解决方案很简单,并且可以通过代码完成,这样,如果有人试图覆盖您服务器中的 X-Frame-Otions 设置,您将更加安全。任何多重设置都将在 'deny'.

中派生

在你项目的 startup.cs 文件中,你必须添加这个,以防止 .net 核心自动添加 'sameorigin' 设置。

 public void ConfigureServices(IServiceCollection services)
 {
        //YOU CAN HAVE SOME CODE HERE

        services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = true);
 }

但是,这可能会给您的站点带来风险,当您对两个站点和两个域都具有控制权时,将应用此方案。

为了保护站点,您必须设置 X-frame-options 设置以允许您想要的域。再次在 startup.cs 中执行以下操作。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //YOU MAY HAVE SOME CODE HERE

        app.Use(async (context, next) =>
        {
            context.Response.Headers.Add("X-Frame-Options", "ALLOW-FROM http://*.MYCONTROLLEDDOMAIN.COM https://*.MYCONTROLLEDDOMAIN.COM");
            await next();
        });
    }

这样您将允许您的域在 iframe 中请求此网站。