nginx 在浏览器中的多个 X-Frame-Options 标头冲突

Posted

技术标签:

【中文标题】nginx 在浏览器中的多个 X-Frame-Options 标头冲突【英文标题】:Multiple X-Frame-Options headers conflict in browser by nginx 【发布时间】:2021-12-10 00:49:06 【问题描述】:

我正在尝试将远程网页放入我项目中的 iframe。当我尝试打开我的项目网站时,浏览器控制台显示以下错误,并且未在 iframe 中显示页面。

nginx 拒绝在框架中显示“http://www.xxxxx.com/”,因为它设置了多个具有冲突值的“X-Frame-Options”标头(“DENY,ALLOW-FROM http://www. .......com')。退回到“拒绝”。

我还在 nginx xconf 中添加了以下行:

add_header X-Frame-Options "ALLOW-FROM http://www.......com";

我的 Nginx 配置中的任何地方都没有 X-Frame-Options = Deny 配置。 但是,当我运行该页面时,它仍然显示多个标题。就像拒绝是硬编码的默认值。但我只是添加了 1 个标题 (ALLOW-FROM)。 另一个标题 (DENY) 来自哪里,我不明白。当我将响应页面插入 iframe 时,如何绕过响应页面附带的拒绝标头?

我还使用了Chrome Extension Requestly,可以用于add/remove/modify response headers。当我在我的机器上使用 Requestly 扩展时,它可以工作。

但是我不能使用基于 chrome 扩展的解决方案,因为该站点是公开的,并且每个人都不使用 Requestly。所以我正在寻找基于 Nginx-config 的解决方案或任何服务器端解决方案来删除此标头。

【问题讨论】:

【参考方案1】:

我在 Django 设置中解决了这个问题,注释了一些中间件行并添加了一些变量。 178.62.107.96 是我们在其中创建 iframe 并插入 django 服务器创建的网页的服务器:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#'django.middleware.clickjacking.XFrameOptionsMiddleware',
]


X_FRAME_OPTIONS = 'ALLOW-FROM 178.62.*.*'
CSRF_TRUSTED_ORIGINS = ['178.62.*.*']
CSRF_COOKIE_SAMESITE = None

【讨论】:

以上是关于nginx 在浏览器中的多个 X-Frame-Options 标头冲突的主要内容,如果未能解决你的问题,请参考以下文章

在LNMP环境下创建多个虚拟主机时出现nginx无法解析php文件故障

尝试用Nginx反向代理解决同时部署多个项目的问题

Nginx基本原理说明

nginx配置X-Frame-Options允许多个域名iframe嵌套

如果配置文件中的多个站点之一无法解析,nginx 将无法启动。 “在上游找不到主机”

Nginx如何配置多个服务域名解析共用80端口详解