网页嵌入zabbix页面(不同域名)
先来结论:
方案一:绕过身份验证:https://www.cnblogs.com/JaSonS-toy/p/4939805.html(我不是这样实现,可以自行尝试)
方案二:
1、保证请求的ip与请求zabbix的ip一致
1.在nginx中增加一个路由跳转到zabbix
2.添加白名单(不然其他域名也能内嵌这个页面)
2-1.nginx添加headers_more模块(卸载后重新编译)
2-2.nginx修改响应头X-Frame-Options(因为chrome和firefox不支持 ALLOW-FROM,所以要做步骤三)
2-3.nginx添加响应头Content-Security-Policy(添加白名单)
2、嵌入页面后,可以选择让用户自行登录,或者后端调取zabbixAPI获取token,返回前端,前端document.cookie='zbx_sessionid={{token}}'
本质上,我把zabbix嵌到我的页面,然后请求我的服务器tp.abc.cn/zabbix,nginx转发到zabbix.abc.cn,zabbix.abc.cn返回给nginx,nginx修改响应头,再返回给客户端。过程中你不需要修改zabbix服务器的任何东西。
过程分析:
1、网上很多人说到Zabbix下的 include/defines.inc.php 文件,把define('X_FRAME_OPTIONS', 'SAMEORIGIN');改为define('X_FRAME_OPTIONS', null);
但实测是不行的,即使改了请求头依然是“X_FRAME_OPTIONS=SAMEORIGIN”。官网也明确表示不能跨域请求了:https://www.zabbix.com/forum/zabbix-help/361685-change-x_frame_options-do-not-work 
2、也有人说可以绕过身份验证,但因为zabbix是运维负责的,我懒得去做绕过身份校验(其实是不会php)
3、所以只能想办法,实现如官网所说的把zabbix的域名和框架中的域名一致(例如zabbix的域名是zabbix.abc.cn,框架的域名是tp.abc.cn)。我的实现方式是在nginx中增加一个路由跳转到zabbix,这样就可以通过访问tp.abc.cn/zabbix请求zabbix.abc.cn。
4、不能让别人也能通过访问tp.abc.cn/zabbix嵌入zabbix页面吧,所以能不能改成使用白名单呢?理论上响应头里的东西都是可以自定义设置的,但是nginx默认只能增加请求头。即哪怕你加了“X_FRAME_OPTIONS=ALLOW-FROM tp.abc.cn”,请求头中原带的“X_FRAME_OPTIONS=SAMEORIGIN”依然存在。如果想修改则要添加headers_more模块(自行百度添加,有人说可以动态添加,我只尝试了卸载后重新添加)。实践发现即使把X_FRAME_OPTIONS改成ALLOW-FROM,也没有起到白名单作用(因为chrome和firefox不支持 ALLOW-FROM),所以要使用响应头Content-Security-Policy设置白名单
注意:测试环境中,虽然嵌入的页面能访问到zabbix,但是登录成功也不会跳到监控页面。因为此时域名依然是不同的,zabbix返回的Set-Cookie没有设置SameSite=None,在跨域时chrome不会进行Set-Cookie操作

浙公网安备 33010602011771号