1、背景介绍

  之前一直从事PHP开发工作,公司内业务均由PHP实现,最近由于公司架构微调,分配了几个Java项目给团队,但是由于团队对Java不熟悉,有几人对Java理解程度也是略懂,这里说的略懂,真的是略懂,所以不敢直接改Java代码。那么怎么办呢?经过商量将Java项目的新需求,暂时还是用PHP来实现,但是有一个前提:域名和URL不能变,不能Java代码用一个域名,PHP用另外一个,因为项目提供的接口有被手机APP客户端调用,如果更改接口域名或者是URL,客户端要重新对接,假如将来PHP 要换回Java 又要重新对接,这样非常不方便,所以域名和接口URL不能变化。

  新需求不外乎包含两种: 第一 更改之前的已有的功能;第二 新增之前没有的功能。

  对于上面两种情况,第一种情况比较复杂,意味着要把Java已经实现的功能放弃(代码不用改),用PHP实现一遍,在此基础上添加新需求的功能,并且URL还不能变。第二种情况需要用PHP实现新功能,当然URL也是新的。根据上面分析,我们必须实现可以识别哪些URL是Java代码负责的,哪些URL是PHP代码负责的,并把它们分配到对应的服务器上去才行。

2、方案设计

  根据上面的背景分析就是要实现PHP和Java处理同一个域名的不同URL请求,经过团队内部讨论可以用Nginx反向代理来实现,所谓的反向代理就是来自互联网的请求不直接访问web服务器,而是先访问反向代理服务器(我们这里用Nginx),之后Nginx服务器将请求转发到(内网环境)服务器。

  具体方案如下:

    首先,我们要给PHP站点和Java站点分别申请一个内网域名,例如(www.php.domain  和 www.java.domain)

    1、假如需求是要更改之前java的已经实现的功能。由于此时由于URL已经存在,且不能更改,我们要把URL转到PHP服务器上去处理,这样的情况,可以在反向代理服务器上通过正则去匹配这个需要用PHP来实现已经存在的URL,之后把他rewrite到PHP处理路径再分发到PHP服务器处理(prox_pass www.php.domain)。

    2、假如需求是要开发新功能。由于之前的URL不存在,首先要制定一个PHP处理URL路径约定(或者说规定),就是哪些路径下的请求是用PHP来处理的。例如:http://www.abc/php/* 这路径下所有请求都用PHP处理,其他路径的所有请求都用Java处理,这样根据Nginx Rewrite正则来匹配/php/ 路径之后rewrite到php处理路径,之后分发到PHP服务器(prox_pass  www.php.domain)。

    3、剩下的其他请求,还是需要java来处理,所以当上面两种URL都没有匹配上,自然就由java来处理,直接(prox_pass www.java.domain)

      下面是架构图:

    

3、nginx配置文件代码

server{
listen ;
server_name www.abc.com; #PHP处理的请求
location ^~ /php/ {
rewrite ^/php/(.*)?(.*)$ /index.php?service=$$ break; #重写到PHP处理(这里只是示例,大家根据自己路径更改)
try_files $uri @my_php;
} #原来由java处理,现在改为PHP处理的请求
location ^~ /java/urione{
rewrite ^/java/urione(.*)$ /index.php?service=Other.GetTime$ break; #重写到PHP处理(这里只是示例,大家根据自己路径更改)
try_files $uri @my_php;
} #原来该java处理的,现在还是由java处理
location / {
try_files $uri @my_java;
} location @my_php {
proxy_pass http://www.php.domain:;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} location @my_java {
proxy_pass http://www.java.domain:;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

反向代理实现同域名下PHP和Java共存的更多相关文章

  1. nginx反向代理实现跨域请求

    nginx反向代理实现跨域请求 跨域请求可以通过JSONP实现,缺点是需要修改被请求的服务器端代码进行配合,稍显麻烦通过在自己服务器上配置nginx的反向代理,可以轻松实现跨域请求 思路 示例服务器A ...

  2. windows环境下 nginx+iis 反向代理解决跨域问题

    项目基本完成,是时候花点时间整理一下最近的姿势了 1 什么是跨域? 网上对于跨域的概念会有大篇幅的文章去解释,似乎有点玄乎,初学者很容易对这个概念产生恐惧,跨域其实很简单,其实只要知道一点,无法跨域访 ...

  3. nginx反向代理解决跨域问题

    跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 下表格为前后端分离的域名,技术信息:   域名 服务器 使用技术 前端 http://b.yynf.com ...

  4. VUE线上通过nginx反向代理实现跨域

    1.NGINX反向代理实现跨域 VUE代码中配置参考上一篇文章 nginx配置,红色框线内: 代码: location /list { proxy_set_header X-Real-IP $remo ...

  5. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  6. 利用nginx 反向代理解决跨域问题

    说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题. 一般来说可以用来做:静态页面的服务器.静态文件缓存服务器.网站反向代理.负载均衡服务器等等,而且实现这一切,基本只需要改改那 ...

  7. nginx介绍(六) - 通过反向代理实现跨域访问

    前言 跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域 假如你是百度开发人员, 在百度页面去 ...

  8. nginx反向代理解决跨域问题,使本地调试更方便

    我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...

  9. vue反向代理解决跨域

    问题描述 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http ...

随机推荐

  1. Web开发:URL编码与解码

    通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key= ...

  2. Download failed : Oracle JDK 7 is NOT installed,解决oracle jdk7的问题

    先了解下概念: jdk(java development kit),就是java的开发工具集,顾名思义就是做开发用的,其中包括javac,也就是java compiler等.jre(java runt ...

  3. [实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2

    写在前面 上篇文章修改文件上传的逻辑,这篇修改下文件下载的逻辑. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实 ...

  4. spring_150907_sqlmapclientdaosupport_getSqlMapClient

    1.新建java工程:spring_150907_sqlmapclientdaosupport_getSqlMapClient,如下图所示: 2.工程里添加spring.hibernate.ibati ...

  5. Codeforces Round #285 (Div. 1) B - Misha and Permutations Summation 康拓展开+平衡树

    思路:很裸的康拓展开.. 我的平衡树居然跑的比树状数组+二分还慢.. #include<bits/stdc++.h> #define LL long long #define fi fir ...

  6. Java 中(静态)变量、(静态)代码块的执行顺序

    Java 中(静态)变量.(静态)代码块的执行顺序 非原创 本文讨论 Java 中(静态)变量.(静态)代码块的执行顺序 首先创建 3 个类 1.Foo 类 public class Foo { pu ...

  7. elementUI 学习入门之 Button 按钮

    基础按钮用法 按钮分为:默认按钮.朴素按钮(plain).圆角按钮(round).圆形按钮(circle).eg: <el-button plain>朴素按钮</el-button& ...

  8. HDU 6186 CS Course

    保存前缀后缀. 保存一下前缀和后缀,去掉第$i$个位置,就是$L[i-1]$和$R[i+1]$进行运算. #include<bits/stdc++.h> using namespace s ...

  9. 【面试总结-编程】多行两列数据,实现同key的value求和并输出

    一个文件,两列,多行. 第一列是字母,第二列是数字,同列数据之间通过空格分割. 统计首列字母相同的第二列之和. 样例输入: A 5 B 6 OO 7 A 6 A 2 OO 2 输出: A:13 B:6 ...

  10. shell 文件传 参数

    n cross-platform, lowest-common-denominator sh you use: #!/bin/sh value=`cat config.txt` echo " ...