反向代理实现同域名下PHP和Java共存

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 80;
    server_name www.abc.com;

    #PHP处理的请求
    location ^~ /php/ {
        rewrite ^/php/(.*)?(.*)$ /index.php?service=$1$2 break; #重写到PHP处理(这里只是示例,大家根据自己路径更改)
        try_files $uri @my_php;
    }

    #原来由java处理,现在改为PHP处理的请求
    location ^~ /java/urione{
        rewrite ^/java/urione(.*)$ /index.php?service=Other.GetTime$1 break; #重写到PHP处理(这里只是示例,大家根据自己路径更改)
        try_files $uri @my_php;
    }

   #原来该java处理的,现在还是由java处理
    location / {
        try_files $uri @my_java;
    }

    location @my_php {
        proxy_pass http://www.php.domain:80;
        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:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
时间: 2024-11-08 23:29:16

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

【nginx学习】nginx反向代理前端跨域问题

* 跨域简介: 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源. 注意:跨域限制访问,其实是浏览器的限制. 跨域类型: URL 说明 是否跨域 http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 是 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域

nginx反向代理解决跨域

上面已经说到,禁止跨域问题其实是浏览器的一种安全行为,而现在的大多数解决方案都是用标签可以跨域访问的这个漏洞或者是技巧去完成,但都少不了目标服务器做相应的改变,而我最近遇到了一个需求是,目标服务器不能给予我一个header,更不可以改变代码返回个script,所以前5种方案都被我否决掉.最后因为我的网站是我自己的主机,所以我决定搭建一个nginx并把相应代码部署在它的下面,由页面请求本域名的一个地址,转由nginx代理处理后返回结果给页面,而且这一切都是同步的. 关于nginx的一些基本配置和安

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

本文探讨了前端如何通过Nginx反向代理的方式解决跨域问题. 跨域 再次重申: 跨域是浏览器行为,不是服务器行为. 实际上,请求已经到达服务器了,只不过在回来的时候被浏览器限制了.就像Python他可以进行抓取数据一样,不经过浏览器而发起请求是可以得到数据,想到通过Nginx的反向代理来解决跨域问题. 代理 所谓代理就是在我们和真实的服务器之间有一台代理服务器,我们所有的请求都是通过它来进行转接的. 正向代理 正向代理就是我们访问不了Google,但是我在国外有一台vps,它可以访问Google

nginx反向代理和跨域

server { listen 80; #listen [::]:80; server_name weather.xxx.com ; index index.html index.htm index.php default.html default.htm default.php; include none.conf; #error_page 404 /404.html; location / { add_header 'Access-Control-Allow-Origin' "*"

Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为域名地址(在跨域问题上,域仅仅是通过“ url的首部 ”来识别而不会去尝试判断相同的IP地址对应着两个域或者两个域是否同属同一个IP),之中任意服务端旗下的客户端发起请求其它服务端资源的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源. 但很多时候我们却又不得不

nginx反向代理-解决前端跨域问题

1.定义 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源.注意:跨域限制访问,其实是浏览器的限制.理解这一点很重要!!! 2.跨域访问示例 假设有两个网站,A网站部署在:http://localhost:81 即本地ip端口81上:B网站部署在:http://localhost:82 即本地ip端口82上. 现在A网站的页面想去访问B网站的信息,A网站页面的代码如下(这里

最简单实现跨域的方法----使用nginx反向代理

原文: http://blog.csdn.net/shendl/article/details/48443299 什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口相同.浏览器执行javascript脚本时,会检查这个脚本属于那个页面,如果不是同源页面,就不会被执行. 同源策略的目的,是防止黑客做一些做奸犯科的勾当.比如说,如果一个银行的一个应用允许用户上传网页,如果没有同源策略,黑客

nginx反向代理cas应用实践(多地址跳转)

问题的提出:最近单位遇到一个需求,单位a和单位b,都通过专线连接到我单位,单位b提出需要访问单位a网络中的一个网站应用,本来很简单问题,只需要我单位中一台可以访问两边网络的服务器上,架设nginx就可以解决该问题,事实上,我天真了! (ps:本文仅针对对nginx反向代理有一定了解的朋友,如不了解请自行百度) 问题出现在这个网站应用上,他们使用了cas架构,在系统登录的url地址和应用的地址不在一起:如下 当使用系统的地址访问时,他跳转到下面的位置,显示了登录页面: 当登录系统后,又跳转回192

centos安装Nginx,反向代理配置全过程

1.安装依赖 #gcc安装,nginx源码编译需要 yum install gcc-c++ #PCRE pcre-devel 安装,nginx 的 http 模块使用 pcre 来解析正则表达式 yum install -y pcre pcre-devel #zlib安装,nginx 使用zlib对http包的内容进行gzip yum install -y zlib zlib-devel #OpenSSL 安装,强大的安全套接字层密码库,nginx 不仅支持 http 协议,还支持 https(