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

问题的提出:最近单位遇到一个需求,单位a和单位b,都通过专线连接到我单位,单位b提出需要访问单位a网络中的一个网站应用,本来很简单问题,只需要我单位中一台可以访问两边网络的服务器上,架设nginx就可以解决该问题,事实上,我天真了!

(ps:本文仅针对对nginx反向代理有一定了解的朋友,如不了解请自行百度)

问题出现在这个网站应用上,他们使用了cas架构,在系统登录的url地址和应用的地址不在一起:如下

当使用系统的地址访问时,他跳转到下面的位置,显示了登录页面:

当登录系统后,又跳转回192.168.20.150这个地址上。

查了一下cas,应该是用于登录权限管理的。

通过fiddle跟踪,发现在使用http://192.168.20.164登录时,返回了如下信息

红线标出了,浏览器下次跳转的url,继续跳转,返回:

继续跳,返回:

到这里,再跳转到index.aspx就进入系统了。

是不是有点晕!总结一下:

进入系统,一共进行了三次跳转,系统的登录首页在192.168.20.164上面,点击登录成功后,就跳转到192.168.20.150上面去。

可以看出192.168.20.164是一个管理登录的服务器,系统的真实服务器在192.168.20.150上面。

好了,大体情况清楚了,但问题是如何实现我们的需求呢??

1、通过网络方式,开通两边的网络,这样肯定应该是可以,但太暴力了,也不允许,不现实,pass掉。

2、在中间服务器,使用nginx反向代理,但常规的方式,显然满足不了当前的情况,如果浏览器根据响应返回的location跳转,就会访问不到了,只能看如何在响应头返回前端浏览器前,更改掉Location,让它继续指向我们自己的nginx服务器地址。

所以,我安装一个台新的centos服务器在192.168.253.155上面,安装nginx 1.9.9,因为需要改变响应头中的Location值,需额外安装ngx_headers_more模块。

在《nginx替换响应头(重点:如何在替换时加上if判断)》这篇文章中有详细的介绍。

nginx.conf主要配置如下:

    map $upstream_http_Location $location{
        ~http://192.168.20.150/(?<param>.*) $param;
         default $upstream_http_Location;
    }

... ...

    server {
        listen       80;
        server_name  localhost;

        location /xt/ {
             set $qz http://192.168.253.155/;
             more_set_headers -s '302' 'Location:$qz$location';
             add_header Cache-Control 'no-cache';
             add_header Cache-Control 'no-store';

             sub_filter  '/smportal-cas/'   '/xt/smportal-cas/';
             sub_filter_once off;
             proxy_pass http://192.168.20.164:XXXX/;
        }

       location / {
... ...
             proxy_pass http://192.168.20.150/;
        }

... ...

最上面的map用于将登录页面返回响应头中Location为的内容映射到变量$location中去,我们可以看到,在192.168.20.164上登录成功后,首先就跳转到http://192.168.20.150/xxx/xxx.aspx?ticket=xxxxxx,如下图:

这时我们通~http://192.168.20.150/(?<param>.*) $param;取出150/后面的内容(因为每次后面的内容会不同)赋到$location中。

(注:(?<xxx> xxxx)是nginx中通过正则取值到变量的方法,此处首先赋值给了$param,然后通过map映射到$location。

至于为什么不用$upstream_http_Location直接取值,用if判断呢?前面推荐的那篇文章写的很清楚。)

接下来配置,将http://192.168.253.155/xt/的访问代理到http://192.168.20.164上面,让用户可以访问登录页面。

其中

set $qz http://192.168.253.155/; #设置变量$qz为我们自己的地址
             more_set_headers -s '302' 'Location:$qz$location'; #将$qz和$location(保存着刚才取到需跳转url的后面路径和参数部分)拼接成指向我们自己nginx的地址,即替换原先url中http://192.168.20.150为http://192.168.253.155

最后配置http://192.168.253.155/的访问代理到http://192.168.20.150上面去,即完成了本次的任务。

(ps: sub_filter的部分,是因为在登录页面中有很js,包括登录按钮提交时的url都使用了绝对的地址,所以需要在返回页面到前端前替换掉这些url,增加我们前辍/xt/,这样访问才没有问题。

其实,实际情况中, 有很多的限制,比如单位b访问我单位的nginx服务器时,由于中间有网络设备不好调整,限制访问端口只能用80,而不能增加其它端口,所以配置只能使用子路径来区分多代理,本来可以用多端口就不用sub_filter替换内容了。

在实验的过程中,也尝试过用\代理登录的192.168.20.164服务器,用子路径\xt代理系统服务器,最后引出了cookie的设置问题,虽最终没这样设,但发现nginx可以设置cookie的path,以保证代理时路径改变,cookie作对应的调整,特在此备注一下:

proxy_cookie_path  /   /xt/;#将cookie的path的/映射为 /xt/

感觉nginx真的很方便,原先为了实现反向代理、跨域,可是用编程实现的,唉。

原文地址:http://blog.51cto.com/13876446/2146845

时间: 2024-11-08 11:07:36

nginx反向代理cas应用实践(多地址跳转)的相关文章

Nginx反向代理入门到实践

Nginx反向代理入门到实践 Nginx反向代理的作用: 由于公司内网有多台服务器的http服务要映射到公司外网静态IP,如果用路由的端口映射来做,就只能一台内网服务器的80端口映射到外网80端口,其他服务器的80端口只能映射到外网的非80端口.非80端口的映射在访问的时候要域名加上端口,比较麻烦.并且公司入口路由最多只能做20个端口映射.肯定以后不够用. 然后发现可以在内网搭建一个nginx反向代理服务器,将nginx反向代理服务器的80映射到外网IP的80,这样指向到公司外网IP的域名的HT

Cento7+Nginx反向代理实现多域名跳转

近期比较忙,所以很少写文档了,最近有个项目组有多个环境需要做映射,所以就想到了通过Nginx反向代理实现多域名地址跳转,以致就总结了一下,其实说到代理我们大家都知道.最常见最常说的所谓的就是NAT,就是将内部多个地址请求通过代理转达到外部.这个就叫正向代理,那什么是反向代理呢-就是和正向代理相反:所以很好理解,Nginx反向代理功能很强大,可以通过一个nginx代理实现多个域名及不同的端口进行代理转发,所以在日常的运维中很有帮助.我们今天的演示是通过Nginx反向代理实现内部不同的多个域名转发.

搭建nginx反向代理用做内网域名转发

基于域名的7层转发的实现(NAT+反向代理) 在实际办公网中,因为出口IP只有一个,要实现对外提供服务的话就必须得做端口映射,如果有多个服务要对外开放的话,这只能通过映射不同端口来区分,这在实际使用过程中非常的痛苦(记忆困难.一一对应关系也没有规律.访问的时候还得加端口),这个痛苦的问题用表格的形式来形象的描述如下: Public IP Public Port Number Internal IP Internal Port Number Note 1.1.1.1 80 192.168.1.10

Linux系统——Nginx反向代理与负载均衡

集群集群是指一组(若干个)相互独立的计算机,利用高速通信网路组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运用各自服务的独立服务器.这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理.当用户客户机请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器. 特点:(1)高性能用户通过Internet到公司的网关,网关通过防火墙,调载到前端的主负载均衡服务器上(有主有备,预防单点问题),主负载均

Nginx反向代理的配置

Chapter: Nginx基本操作释疑 1. Nginx的端口修改问题 2. Nginx 301重定向的配置 3. Windows下配置Nginx使之支持PHP 4. Linux下配置Nginx使之支持PHP 5. 以源码编译的方式安装PHP与php-fpm 6. Nginx多站点配置的一次实践 7. Nginx反向代理的配置 Nginx 作为 web 服务器一个重要的功能就是反向代理.其实我们在前面的一篇文章<Nginx多站点配置的一次实践>里,用的就是 Nginx 的反向代理,这里简单再

nginx反向代理

1. 操作系统 CentOS 6.4 x86_64 2.软件版本 Nginx 1.4.2 3.实验拓扑 注,实验拓扑见下文. 4.安装yum源 1 2 3 [root @nginx ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [[email protected] ~]# rpm -ivh http://download.fedoraproject.org/

Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin

Php学习之nginx反向代理详解

本文和大家分享的主要是php中nginx反向代理相关内容,一起来看看吧,希望对大家学习php有所帮助. 一.概念理解 1.代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机. 2.为什么要使用代理服务器 ①提高访问速度 由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存

Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin