使用nginx反向代理解决前端跨域问题
1.
首先去Nginx官网下载一个最新版本的Nginx,下载地址:http://nginx.org/en/download.html。我这里下载的版本是:nginx/Windows-1.12.0。下载完成之后,得到一个.zip的压缩包,把压缩包解压到E盘根目录。如图1-1
2.
打开目录 E:\nginx\conf ,编辑nginx.conf文件,修改成如下:
- #user nobody;
- worker_processes 1;
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- #pid logs/nginx.pid;
- events {
- worker_connections 1024;
- }
- http {
client_max_body_size 100M;- include mime.types;
- default_type application/octet-stream;
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"';
- #access_log logs/access.log main;
- sendfile on;
- #tcp_nopush on;
- #keepalive_timeout 0;
- keepalive_timeout 65;
- #gzip on;
- server {
- listen 80; # nginx访问端口
- server_name localhost; # nginx访问域名
- location / {
- proxy_pass http://127.0.0.1:8020; # 前端静态页面地址
- proxy_redirect default;
- #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- location /apis { # 自定义nginx接口前缀
- rewrite ^/apis/(.*)$ /$1 break; # 监听所有/apis前缀,是则转发后台api接口地址
- include uwsgi_params;
- proxy_pass http://127.0.0.1:8080; # 后台api接口地址
- #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
- }
注: 如果项目接口路径后面带前缀的,需要如下设置:
- location /apis/ { # 自定义nginx接口前缀
- rewrite ^/apis\//(.*)$ /$1 break; # 监听所有/apis前缀,是则转发后台api接口地址
- include uwsgi_params;
- proxy_pass http://127.0.0.1:8080/ser/; # 后台api接口地址
- #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- http://chenwenming.blog.51cto.com/327092/1203537
- 在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
- 下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
- 第一种:
- location /proxy/ {
- proxy_pass http://127.0.0.1:81/;
- }
- 会被代理到http://127.0.0.1:81/test.html 这个url
- 第二咱(相对于第一种,最后少一个 /)
- location /proxy/ {
- proxy_pass http://127.0.0.1:81;
- }
- 会被代理到http://127.0.0.1:81/proxy/test.html 这个url
- 第三种:
- location /proxy/ {
- proxy_pass http://127.0.0.1:81/ftlynx/;
- }
- 会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
- 第四种情况(相对于第三种,最后少一个 / ):
- location /proxy/ {
- proxy_pass http://127.0.0.1:81/ftlynx;
- }
- 会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
- 上面的结果都是本人结合日志文件测试过的。从结果可以看出,应该说分为两种情况才正确。即http://127.0.0.1:81 (上面的第二种) 这种和 http://127.0.0.1:81/.... (上面的第1,3,4种) 这种。
- -----------------------------------------------------------------------------------------
- nginx proxy_pass末尾神奇的/
- http://backend;和http://backend/;有什么区别呢?
- location /service/ {
- proxy_pass http://backend;
- proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
- }
- location /service/ {
- proxy_pass http://backend/;
- proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
- }
- 同样访问:http://neverstay.com/service/add.php
- 前者配置,在后端的机器,收到的是http://neverstay.com/service/add.php
- 后者配置,在后端的机器,收到的是http://neverstay.com/add.php
- 如果换成下面这样,会报错:
- location ~ ^/(service)/ {
- proxy_pass http://backend/;
- proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
- }
- "proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in nginx.conf:
- 但是,这样就没问题了:
- location ~ ^/(service)/ {
- proxy_pass http://backend;
- proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
- }
- 把proxy_pass末尾的斜线去掉,就可以了。
3.
启动nginx,进入目录 E:\nginx,点击空白处,按住Shift + 鼠标右键 --> 点击“在此处打开命令窗口”,输入命令:
启动:start nginx
停止:nginx -s stop
重启:nginx -s reload
4.
访问 http://localhost/前端项目名/index.html
5.
ajax接口访问地址由原来的 http://127.0.0.1:8080/api/xxx...
变成:/apis/api/xxx...
附:使用nginx后,后台获取请求头的一些信息。
- ###### 不用nginx代理
- referer--------------http://localhost:8066/index.html
- accept-language--------------zh-CN,zh;q=0.9
- cookie--------------Hm_lvt_b393d153aeb26b46e9431fabaf0f6190=1510729582; Idea-d796403=72c2352f-4ec9-4a5f-8ccf-15f7de01060b; JSESSIONID=ae31cfd7-b6d7-4c89-af96-a1496fff62c3
- host--------------localhost:8066
- upgrade-insecure-requests--------------1
- connection--------------keep-alive
- accept-encoding--------------gzip, deflate, br
- user-agent--------------Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
- accept--------------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- ###### 使用nginx代理,但不配置可获取客户端真实ip地址
- referer--------------http://127.0.0.1/soeasy/soeasy-web/src/main/webapp/index.html
- accept-language--------------zh-CN,zh;q=0.9
- cookie--------------Idea-d796403=72c2352f-4ec9-4a5f-8ccf-15f7de01060b; JSESSIONID=c36ff1a3-f4f6-46aa-936f-26474a4b31b2
- host--------------127.0.0.1:8066
- upgrade-insecure-requests--------------1
- connection--------------close
- accept-encoding--------------gzip, deflate, br
- user-agent--------------Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
- accept--------------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- ###### 使用nginx代理,并且配置可获取客户端真实ip地址
- x-real-ip--------------127.0.0.1
- referer--------------http://localhost/soeasy/soeasy-web/src/main/webapp/index.html
- accept-language--------------zh-CN,zh;q=0.9
- cookie--------------Hm_lvt_b393d153aeb26b46e9431fabaf0f6190=1510729582; Idea-d796403=72c2352f-4ec9-4a5f-8ccf-15f7de01060b; JSESSIONID=c0de95b1-71da-41d9-a70b-62e8fb5d2a66
- host--------------localhost
- upgrade-insecure-requests--------------1
- connection--------------close
- x-forwarded-for--------------127.0.0.1
- accept-encoding--------------gzip, deflate, br
- user-agent--------------Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
- accept--------------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
使用nginx反向代理解决前端跨域问题的更多相关文章
- 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题
一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...
- nginx反向代理-解决前端跨域问题
1.定义 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源.注意:跨域限制访 ...
- 利用nginx做反向代理解决前端跨域问题
最近朋友再群里提了一个问题,他们公司给他提供了一个获取数据的接口,在浏览器访问这个接口能获取到json数据,但是放在项目里使用ajax就产生了跨域问题,一般这个需要提供接口的后台方面需要做跨域处理,但 ...
- Nginx反向代理解决iframe跨域问题
前言 这几天有个需求:做个表单页面,要求后台人员能自定义发布表单,用户来填写表单.我一想,这不麦克表单有现成的吗,拿来就用!发布表单后,可以选择使用iframe方式嵌入网站,一切顺利. 当时的网站是h ...
- 使用webpack-dev-server设置反向代理解决前端跨域问题
webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.j ...
- 简单配置nginx反向代理,实现跨域请求
简单配置nginx去做反向代理,实现跨域请求 简单介绍nginx的nginx.conf最核心的配置,去做反向代理,实现跨域请求. 更多详细配置,参考nginx官方文档 先介绍几个nginx命令 打开n ...
- 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 ...
随机推荐
- JAVA-JSP内置对象之request对象参数
相关资料:<21天学通Java Web开发> request对象1.request对象不但可以用来设置和取得requset范围变量,还可以用来获得客户端请求参数请求的来源.表头.cooki ...
- 2. 感知机(Perceptron)基本形式和对偶形式实现
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 基于jQuery全屏相册插件zoomVisualizer
基于jQuery全屏相册插件zoomVisualizer.这是一款基于jquery ui实现的相册插件,支持隐藏显示相册缩略图,支持左右箭头切换图片,支持放大缩及缩小图片.效果图如下: 在线预览 ...
- [转]你所不知的 CSS ::before 和 ::after 伪元素用法
SS 有两个说不上常用的伪类 :before 和 :after,偶尔会被人用来添加些自定义格式什么的,但是它们的功用不仅于此.前几天发现了 Creative Link Effects 这个非常有意思的 ...
- Linux下高并发socket最大连接数所受的各种限制(转)
1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个 ...
- WPF视频会议系统资料
Android和C#实现实时视频传输Demo 视频会议及流媒体十大开源项目 WinForm二三事(三)Control.Invoke&Control.BeginInvoke
- Python MQTT订阅获取发布信息字典过滤
起因是因为 订阅的时候,获取到的 MQTT 信息时,第一条信息好像是连接信息,所以需要过滤他. 接收到的数据如下 必须要过滤这个 name : 1 的字典,操作如下: def on_message(c ...
- Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现
Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现 2015-03-10 22:38 28419人阅读 评论(17) 收藏 举报 分类: Android ...
- 聊下图片滤镜,手机上的,lookup table(颜色查找表
今天这里要介绍的是lookup table(颜色查找表),简而言之就是通过将每一个原始的颜色进行转换之后成为一个新的颜色. 打一个比方,比如原始颜色是红色(r:255,g:0,b:0),进行转换后变为 ...
- JVM垃圾回收算法(最全)
JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:j ...