问题
用户安装的是搜狗浏览器,在使用的时候发现下载不了excel文件。排查发现浏览器报Refused to display in a frame because it set multiple 'X-Frame-Options' headers with conflicting values ('SAMEORIGIN, DENY'). Falling back to 'deny'
的错误。
解决方案
分析了下可能是nginx服务器的配置问题。进入nginx服务器的配置文件,发现配置的是add_header X-Frame-Options DENY
,将其改成了add_header X-Frame-Options SAMEORIGIN;
。先执行sudo ./nginx -c /dydata/server/nginx/conf/nginx.conf
命令(如果发现有nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)这个错误,执行下sudo fuser -k 80/tcp
干掉80端口。在执行一下sudo ./nginx -c /dydata/server/nginx/conf/nginx.conf
命令),然后在执行sudo ./nginx -s reload
命令,重启nginx服务器。测试发现可以下载了。
什么是X-Frame-Options?
X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>
,<iframe>
或者 <object>
中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
使用 X-Frame-Options
X-Frame-Options 有三个值:
- DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
- SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。
- ALLOW-FROM uri 表示该页面可以在指定来源的 frame 中展示。
换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。
配置 Apache
配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 ‘site’ 的配置中:
配置 nginx
配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置中:
配置 IIS
配置 IIS 发送 X-Frame-Options 响应头,添加下面的配置到 Web.config 文件中: