Nginx反向代理解决iframe跨域问题
前言
这几天有个需求:做个表单页面,要求后台人员能自定义发布表单,用户来填写表单。我一想,这不麦克表单有现成的吗,拿来就用!发布表单后,可以选择使用iframe方式嵌入网站,一切顺利。


当时的网站是http协议,后来升级了https,发现完全加载不出来。原因是浏览器的安全限制,在https协议下不允许有http的iframe请求。然而,除了交钱,也不能将麦克的协议变成https
前端无法解决这个问题,想了想,可以使用Nginx反向代理来实现。说白了,就是把自己的服务器当做代理服务器,骗过浏览器,让它以为是向自己的服务器发请求。
正文
目标网址:http://www-smcic-cn.mikecrm.com/i0RPpTH
代理网址:https://www.smcic.cn/mikecrm/
首先,将前端的iframe src属性地址改成自己的
<iframe src="https:www.smcic.cn/mikecrm/"></iframe>
接下来是Nginx配置,需要将以下代码写在https的server中:
location /mikecrm/ {
proxy_pass http://www-smcic-cn.mikecrm.com/i0RPpTH;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
试了试,确实能加载iframe。但是,iframe中有大量的css、js、img等资源要请求,并没有通过以上配置代理,结果全部返回404,很是苦恼。
通过分析资源请求路径,发现是这样的,例如 http://www-smcic-cn.mikecrm.com/css/... 或 http://www-smcic-cn.mikecrm.com/form/.../......

逻辑并不难,奈何本人正则水平太差,在经历了痛苦的尝试之后,终于摸索出了一条道路:
resolver 223.5.5.5 119.29.29.29 114.114.114.114; # 域名解析,要写在server外面
location /mikecrm/ {
set $flag 0;
if ( $request_uri = "/mikecrm/" )
{
set $para "i0RPpTH";
}
if ( $request_uri != "/mikecrm/" )
{
set $flag "${flag}1";
}
if ( $request_uri ~ /mikecrm/(.*) )
{
set $paaa $1;
set $flag "${flag}2";
}
if ( $flag = "012" )
{
set $para $paaa;
}
proxy_pass http://www-smcic-cn.mikecrm.com/$para;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
注意及解释:
1.在代理地址proxy_pass中如果存在变量($para),必须要使用resolver指令解析变量中的域名,因为Nginx一开始就会解析好域名。(其实是变量涉及到域名才需要用resolver,我这里没涉及到域名,想不通为什么也必须要resolver)。推荐使用多个dns解析地址,最好是国内的。
2.Nginx中不支持if else,也不支持条件嵌套,如果有条件判断与的需求,可以参照后三个if{}的配合使用
3.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 可记录真实的用户访问IP
4.大概思路是,先判断请求uri,如果是第一次请求(即/mikecrm/,请求iframe页面)则转向访问http://www-smcic-cn.mikecrm.com/i0RPpTH,如果不是第一次请求(即/mikecrm/.../.....,请求资源)则转向访问资源。
优化
虽然取得阶段性成功,但此配置只能适用于特定的这个表单,要多个表单都能够使用,还需要再改配置
前端请求地址:
https://www.smcic.cn/mikecrm/i0RPpTH/
Nginx配置:
location /mikecrm/ {
set $flag 0;
if ( $request_uri ~ ^/mikecrm/(\w*)/$ )
{
set $mikeid $1;
}
if ( $request_uri = /mikecrm/$mikeid/ )
{
set $para $mikeid;
}
if ( $request_uri != /mikecrm/$mikeid/ )
{
set $flag "${flag}1";
}
if ( $request_uri ~ ^/mikecrm/(\w*)/(.*) )
{
set $paaa $2;
set $flag "${flag}2";
}
if ( $flag = "012" )
{
set $para $paaa;
}
proxy_pass http://www-smcic-cn.mikecrm.com/$para;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
参考文档:
1.https://www.cnblogs.com/taosim/articles/4097728.html
2.https://blog.csdn.net/u014296316/article/details/80973530
3.https://www.cnblogs.com/netsa/p/6383094.html
4.https://segmentfault.com/a/1190000002797606#articleHeader6
5.http://www.udpwork.com/item/12552.html
6.https://www.cnblogs.com/wangzhisdu/p/7837726.html
Nginx反向代理解决iframe跨域问题的更多相关文章
- 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题
一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...
- nginx反向代理-解决前端跨域问题
1.定义 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源.注意:跨域限制访 ...
- 使用nginx反向代理解决前端跨域问题
1. 首先去Nginx官网下载一个最新版本的Nginx,下载地址:http://nginx.org/en/download.html.我这里下载的版本是:nginx/Windows-1.12.0.下载 ...
- 简单配置nginx反向代理,实现跨域请求
简单配置nginx去做反向代理,实现跨域请求 简单介绍nginx的nginx.conf最核心的配置,去做反向代理,实现跨域请求. 更多详细配置,参考nginx官方文档 先介绍几个nginx命令 打开n ...
- 利用nginx做反向代理解决前端跨域问题
最近朋友再群里提了一个问题,他们公司给他提供了一个获取数据的接口,在浏览器访问这个接口能获取到json数据,但是放在项目里使用ajax就产生了跨域问题,一般这个需要提供接口的后台方面需要做跨域处理,但 ...
- nginx 反向代理,支持跨域,前后分离
前端开发往往涉及到跨域问题,其中解决方案很多: 1.jsonp 需要目标服务器配合一个callback函数. 2.window.name+iframe 需要目标服务器响应window.name. 3. ...
- Nginx反向代理配置可跨域
由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...
- nginx 配置反向代理解决请求跨域问题
server { listen ; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; roo ...
- 使用webpack-dev-server设置反向代理解决前端跨域问题
webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.j ...
随机推荐
- jquery遍历table为每一个单元格取值及赋值
表格代码 <tr> <td> <input type="text" style="border: none; text-align: cen ...
- CMD命令锦集
虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一般Windows 的各种版本都与其兼容,用户可以在Wi ...
- transform-origin
transform-origin:改变原点中心位置 transform-origin是变形原点,也就是该元素围绕着那个点变形或旋转,transform-origin并不是transform中的属性值, ...
- Python random() 函数
描述 random() 方法返回随机生成的一个实数,它在[0,1)范围内. 语法 以下是 random() 方法的语法: import random random.random() 注意:random ...
- JVM学习②
JVM运行机制 1.JVM启动流程 Java启动命令->装载配置寻找jvm.cfg->根据配置寻找JVM.dll(JVM主要实现)->初始化JVM,获得JNIEnv接口 2.JVM基 ...
- tcp.go
) _, err := io.ReadFull(clientConn, buf) if err != nil { p.ctx.nsqd.logf("ERROR ...
- message.go
+MsgIDLength:] return &msg, nil } func writeMessageToBackend(buf *bytes.Buffer, msg *Message ...
- netty源码分析之揭开reactor线程的面纱(一)
netty最核心的就是reactor线程,对应项目中使用广泛的NioEventLoop,那么NioEventLoop里面到底在干些什么事?netty是如何保证事件循环的高效轮询和任务的及时执行?又是如 ...
- BZOJ_1895_Pku3580 supermemo_Splay
BZOJ_1895_Pku3580 supermemo_Splay Description 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx ...
- python selenium中Excel数据维护(二)
接着python里面的xlrd模块详解(一)中我们我们来举一个实例: 我们来举一个从Excel中读取账号和密码的例子并调用: ♦1.制作Excel我们要对以上输入的用户名和密码进行参数化,使得这些数据 ...