设为首页 收藏本站
查看: 680|回复: 0

[经验分享] Apache Httpd的mod_proxy模块修改了HTTP的响应吗

[复制链接]

尚未签到

发表于 2015-11-14 09:47:16 | 显示全部楼层 |阅读模式
  前几天,一个开发组开发的一个模块,放到我们的产品环境上去后,发现其中的一个功能没有正常工作。用Fiddler查看HTTP记录,发现那个功能的发出的HTTP请求返回了500错误。查看文档,500代表Internal Server Error,服务器出错了。
  问题抛回给负责开发的组,他们查看了服务器log,没有发现相关的错误。而这个功能在他们自己开发的环境上都是可以的。
  难道和我们产品环境的部署有关?产品环境和开发环境的不同就只有,产品环境上用了Apache Httpd,并使用了mod_proxy做一个反向代理。尝试在产品环境上绕过Apache直接去访问对应的服务器,发现竟然真的是可以的。 用Fiddler一查,发现响应和Apache代理后的几乎没区别,唯一的不同就是返回的是298响应码。298?好像原来没看到过这个码,查文档,RFC确实没有明确的定义这个响应码。猜想,问题应该是因为服务返回了一个不标准的响应吗,Apache的mod_proxy就将它改成了500。
  Google一下,找到了一些:ServerFault上的讨论,貌似Apache的邮件目录。还找到了Apache对这个问题的一个Bug跟踪。总的来说,就是这个问题有些争论:有些人认为不应该随意自己定义响应码;有些人认为按照RFC的规定,响应码是可扩展的,比如2XX都是成功的响应,那么定义298当然也是合理的。但是Apache还是没有改这个问题,这个问题在2.0以后的所有版本上都存在。
  查找文档,希望能找到一些配置能够绕过这个问题,但是没找到。我们表示很无奈,希望开发组能够不要自定义响应码,如果要自定义,可以通过增加自定义响应头来达到同样效果。开发组表示,他们没法修改了,因为使用了一个很公共的模块,短时间内没法改变。我们表示,我们短时间内也没法去掉Apache Httpd。
  继续研究,查看Apache的源代码,发现:如果服务器在返回298响应码的时候,能够同时返回一个字符串跟在响应码后面,Apache就不会修改响应码。这个很合理,按RFC规定,在200响应码后面应该要跟上字符串OK,在201响应码后面应该要跟上字符串Created等等。那我们响应298的时候,也加上一个字符串,既简单,又不会影响现有的功能,也符合规范。唯一的疑惑是,mod_proxy并没有文档说明,他们以后还会遵守这个行为(当然他们对于会修改响应码的这个行为也没提过)。但是至少对于我们现在来说,可以暂时先这样绕过这个问题。
  网上都没发现对这个问题的解决方法,贴出来希望对大家有帮助。
  紧接着又发现了一个类似的问题。有一个功能在没有Apache的时候是可以的,但是在有Apache的时候,就只有在IE下可以,在Chrome和Firefox上都不行。查看Fiddler,发现这个请求从服务器返回的时候没有"Content-Type"响应头,这个时候可能所有浏览器都默认认为响应内容是HTML,所以能够正常工作;而经过Apache代理后,Apache会加上了一个默认的头"Content-Type:text/plain",这个时候就只有IE会识别出类型是HTML并渲染,Chrome和Firefox就直接当文本显示了。解决方法就是修改Apache配置,将默认响应类型从text/plain改为text/html暂时先绕过这个问题。
  不守规范真可怕~, 看来以后还是有必要用http://validator.w3.org/测试一下服务是否符合规范才行。
  

  关键字:Apache,Httpd,mod_proxy,修改响应码
  

         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139034-1-1.html 上篇帖子: Apache Commons BeanUtils包学习(2)-beanutils.PropertyUtils, beanutils.DynaBean 下篇帖子: Apache Directory Studio
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表