`
nigelzeng
  • 浏览: 606727 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

nginx替换apache中的一个跳转问题

阅读更多

昨天在做配置转换的时候发现的这个问题,

简单描述一下吧:

 

之前的架构是:前端apache,后端Jboss,apache使用mod_jk转发请求到后端。

现在的架构是:前端nginx,后端Jboss,nginx作为reverse proxy把请求调度到后端。(那几个中文会被屏蔽!)

web server前还有个NAT设备,提供VIP给客户端链接,转换规则是: VIP:9999 = RIP:80

 

也就是说用户需要用http://nigel.zeng.me:9999的URL才能访问到我web server提供的80端口服务,

在使用apache时,网站可以正常来访问:

 

可以看到这里有3个302跳转:

第一个:我访问http://pmine.xxx.xxx:9999/,会被后端的一个filter拦截,跳转到https://ark.xxx.xx:4430/arkserver/Login.aspx?app=http://pmine.xxxx.xxxx:9999 

第二个:认证通过,再从“https://ark.xxx.xx:4430/arkserver/Login.aspx?app=http://pmine.xxxx.xxxx:9999 ”这串URL里提取出app=http://pmine.xxxx.xxxx:9999 的 “http://pmine.xxxx.xxxx:9999 ”,跳转到这个页面。(这个页面就是刚开始我们访问的页面)

第三个:访问http://pmine.xxxx.xxxx:9999 ,被应用重定向到http://pmine.xxxx.xxxx:9999/console.htm,完成页面展现。

 


我按照apache的规则将配置修改到nginx,(nginx配置上没有错误,实现的功能完全是一样的)。

结果却完全不一样,页面不能访问了:



 

第一次跳转的时候,参数里的原始URL变成了7001端口,而不是我访问时的9999端口,所以当认证完成再跳回第一次访问的URL时,就变成了http://pmine.xxx.xxx.xx:7001,而不是http://pmine.xxx.xxx.xx:9999。

所以导致这个访问没有服务器应答,因为我们监听的是9999端口。

 

流程大致是这样的:


------------------------------------------------------------------------------------- 丑陋的分割线 ------------------------------------------------------ 

 

问题描述完了,那么原因是什么呢?

在第一次做跳转,拼凑URL的时候,代码里是这么写的:

 


 

端口是 userPort这个变量,它取值的逻辑是,如果配置里没有配置端口,那么久使用getLocalPort来获取。

request.getLocalPort()方法会获得请求头里的端口。

 

显然,使用apache时,这里获取到的是 9999端口,而是用nginx时,这里获取到的是7001端口。

 

究其原因(按照我的理解,apache和tomcat内部的机制我没有深入了解):

1、apache与tomcat使用mod_jk来进行的请求转发,是在内部进行的,并没有对数据包的目的IP和目的端口进行修改,所以当后端的Jboss解析这个请求的时候,会解析得到的是原始请求的9999端口。

2、nginx与tomcat的连接是有nginx在前端做转发,通过“proxy_pass:http://127.0.0.1:7001”指令来进行操作,我询问过做nginx开发的一个同事,这里做转发的时候会修改请求的数据包,把目的IP和目的端口修改掉,相当于是nginx本身向后端jboss发起的针对“http://127.0.0.1:7001”这个URL的请求,所以后端的JBoss使用getLocalPort()来获取端口时,得到的就是这个请求URL里的7001端口。

 

所以,拼凑起来的URL,在apache时是正确的原始URL,在nginx时这是端口为7001的错误URL,这就导致在进行认证后用户无法跳转到当初的访问页面,出现访问无响应的情况。

 

 

------------------------------------------------------------------------------------- 丑陋的分割线 ------------------------------------------------------ 

那么解决办法应该可以有两个:

1、在应用的配置项里指定appPort,本文中的情况则需要修改成9999

2、修改getLocalPort()这个获取方式,可以换一种拼凑URL的方式,比如从请求头里的$HOST变量里获取。(针对nginx,需要加上一些配置项,把原始请求的HOST传递到后端,使用proxy_set_head参数。感兴趣的可以交流一下)。

 

 

 

 that's all。

 

  • 大小: 171.4 KB
  • 大小: 21.2 KB
  • 大小: 45.8 KB
  • 大小: 98.3 KB
分享到:
评论
1 楼 uag 2014-09-18  
比如从请求头里的$HOST变量里获取。(针对nginx,需要加上一些配置项,把原始请求的HOST传递到后端,使用proxy_set_head参数。感兴趣的可以交流一下)。

如果使用apache的话,怎么来传递这个host到后端tomcat呢?

相关推荐

    nginx 伪静态 重定向

    在现代网站开发与维护中,面对网页目录结构变动、网页重命名、扩展名改变或是网站域名变更等场景,如何高效处理这些变化,确保用户体验不受影响,同时保持SEO优化效果,成为了一个不容忽视的问题。Nginx,作为一款高...

    Nginx 重写规则教程

    重写规则可以实现从一个location跳转到另一个location,最多允许10次重定向,超过这个次数,Nginx会返回500错误。此外,`set`指令允许创建新的变量并设置它们的值,这对于记录条件标识、传递参数和记录操作行为非常...

    nginx rewrite 实现URL跳转的方法

    Rewrite模块是Nginx提供的一个强大功能,它可以在服务器内部将用户请求的URL按照指定规则进行重写和跳转,达到修改用户访问URL的目的。在配置Nginx时,掌握如何使用Rewrite规则对于实现复杂的URL重写和优化网站的SEO...

    详解nginx配置url重定向-反向代理

    1、地址重定向:是指当使用者浏览某个网址时,将他导向到另一个网址的技术。常用在把一串很长的网址,转成较短的网址。因为当要传播某网站时,常常因为网址太长,不好记忆;又有可能因为换了网路的免费网页空间,...

    windows下Nginx+memcached+Tomcat集群配置实现session共享与负载均衡

    3. **配置反向代理**:在Nginx配置中,定义一个server块,将所有请求转发到上述upstream: ```nginx server { listen 80; server_name example.com; location / { proxy_pass http://tomcat_cluster; proxy...

    ECSHOP 301重定向带动态页面跳转到静态页面插件

    ECSHOP是一款广泛使用的开源电子商务系统,为企业和个人提供了一个强大的在线购物平台。在SEO(搜索引擎优化)的角度来看,将动态页面转化为静态页面对于提升网站的搜索引擎排名具有积极影响。301重定向是一种HTTP...

    halloword2 - 跳转页面

    在IT行业中,跳转页面是Web开发中的一个关键概念,特别是在构建交互式网站时。"Halloword2 - 跳转页面"可能是一个项目或教程的名称,它专门探讨了如何实现网页间的动态跳转。这个主题涵盖了许多重要的知识点,包括...

    部署https(ssl证书)后设置301跳转将http跳转到https的方法 附本站规则

    对于IIS服务器,需要创建一个`web.config`文件并编辑其内容: ```xml ^(.*)$" ignoreCase="false" /> ^on$" negate="true" /> ``` 这段XML代码会创建一个名为"301"的规则,将所有...

    zabbix修改主页IP地址端口和后缀.docx

    在描述中提到的是`/etc/httpd/conf.d/zabbix.conf`,这是一个常见的配置文件路径,但实际路径可能会根据你的系统配置有所不同。打开这个文件,找到类似于`*:8008>`的段落,将`8008`改为`80`,即`*:80>`。 2. **修改...

    http自动跳转https的配置方法

    但如果确实需要使用,可以通过备份并替换IIS中的403-4.htm或403.htm文件来实现一个简单的JavaScript重定向功能,即当用户访问HTTP页面时,通过JavaScript自动跳转到HTTPS页面。 对于Apache服务器,实现HTTP到HTTPS...

    微信公众号多域名授权回调系统php源码

    微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号对接无限多个网站。 网站后台支持回调域名白名单的管理,以及登录记录的查看。 本系统还有微信access_token的获取功能,可让当前...

    403、404、500等报错页面

    500 Internal Server Error 是一个服务器端错误,表明服务器遇到了一个意外的情况,无法完成请求。可能的原因包括: 1. PHP语法错误:服务器在解析PHP脚本时遇到错误。 2. 服务器过载:当服务器资源(如内存、CPU)...

    Https 之 Let's Encrypt

    在这个过程中,Let’s Encrypt作为一个公共且免费的SSL证书颁发机构逐渐被广大用户所接受和使用。Let’s Encrypt是由Mozilla、Cisco、Akamai、IdenTrust、EFF等多个知名组织发起的项目,其目标是为了加速网站从HTTP...

    URL重写URL重写URL重写URL重写

    URL重写是Web开发中的一种技术,主要用于优化和管理网站的URL结构,使其更符合搜索引擎优化(SEO)标准,提高用户体验,并便于服务器管理和应用程序处理。这个技术主要涉及到服务器配置、HTTP请求处理以及URL路径与...

    微链影院V5.2 内置4套模板_免采集+后台管理+会员系统.zip

    请务必登录后台设置替换你的域名,否则源码展示及相关功能不可用,本套源码建议选择使用米酷模板,请到后台设置点击关闭手机版,否则会跳转WAP模板,将无更多功能体验! 可体验最新功能,默认为米酷模板,其他模板...

    PHP入门基础中基础

    1. **PHP安装与环境配置**:在开始编写PHP代码之前,你需要安装一个支持PHP的Web服务器,如Apache或Nginx,并配置PHP解析器(如PHP-FPM)。安装过程中,你可能还会接触到WAMP、XAMPP等集成开发环境,它们简化了PHP、...

    云优CMS企业网站管理系统 v2.0.2 分站版.zip

    (IIS/web.config、Apache/.htaccess、Nginx/nginx.txt) 三、安装方法 1、把本压缩包中所有文件上传或复制到站点根目录下; 2、打开浏览器,执行http://网站访问路径/,根据安装向导一步步完成安装步骤。 云优...

    淘客帝国v5.12完美破解版

    如果需要自定义伪静态,请确认网站服务器支持根目录下.htaccess、httpd.ini、nginx.conf 三个规则文件中的任意一个。如果不知道,请找主机商确认。 2、增加了自动301跳转设置,选中的话,将自动把所有绑定的域名跳转...

    vue20搭建的仿饿了么App

    在"vue20搭建的仿饿了么App"项目中,我们将深入探讨如何利用Vue.js 2.0版本来构建一个类似饿了么的应用。这个项目不仅能够帮助开发者熟悉Vue.js的核心特性,还能通过实际操作提升对前端MVC模式的理解。 1. **Vue.js...

    项目实战手把手教你搭建前后端分离项目 SpringBoot + Vue + Element UI + Mysql(前端)

    在本项目实战中,我们将利用SpringBoot、Vue.js和Element UI以及Mysql数据库来构建一个完整的前后端分离的Web应用程序。这是一个对程序员来说至关重要的技能,不仅能够加深对技术栈的理解,还能为个人职业生涯带来...

Global site tag (gtag.js) - Google Analytics