使用X-Forwarded-*正确处理浏览器端地址信息

在WEB开发中,有一定的场景中需要拿到基于浏览器视角的路径信息。比如在spring hateoas, spring security,以及基于302跳转的各类登陆,认证体系。在这种场景中,服务端拿到的地址信息可能并不是实际浏览器端访问的路径信息,这时候就要考虑地址转换的事务。特别是当前的业务系统必定前端有Nginx,以及https转http类的反向代理等场景。

本文描述了标准的 X-Forwarded-Host, X-Forwarded-Port 和 X-Forwarded-Proto的使用以及在部分框架中使用的 X-Forwarded-Prefix。同时,在业务框架(如Spring)中已经实际应用的示例代码。在具体场景下应当如何来进行正确地使用。

这些头信息Nginx以及浏览器不会自动地添加到请求头中,需要显示地进行配置。

X-Forwarded-Host
一般配置为 $http_host, 表示获取浏览器在请求时的 HOST 头

X-Forwarded-Port
表示浏览器在访问时的实际端口时,如nginx提供http服务,则为80,如果是https,则为 443。如果为标准服务,此项可以不用设置,仅用于非标准端口时才使用

X-Forwarded-Proto
表示浏览器在访问时的实际协议,如nginx提供https转http反向代理时,这里即要配置为 https,表示浏览器是使用https协议来进行访问,但后端可能用http提供服务。如果两边协议相同,则不用设置

X-Forwarded-Prefix
用于当nginx使用前缀代理后端请求时使用。如 浏览器请求的路径为 serviceName/a/b/c, Nginx在Location端通过serviceName匹配到后端服务时,但把前缀 serviceName去掉,实际访问后端为 /a/b/c时,这时即需要设置此值。

继续阅读“使用X-Forwarded-*正确处理浏览器端地址信息”

在nginx中通过map指令来正确添加请求头或修改头

在使用nginx进行请求转发时,由于各种需要,需要往后端在请求头中添加额外的请求头,或者在前端响应时添加后端没有返回的响应头信息。这些都可以在nginx中需要特定的指令来实现.同时,能够做到与业务无冲突.

本文涉及到的部分包括 添加请求头,添加响应头,以及达到ifAbsent的目的, 做到有则跳过,无则添加的目的.

本文参考的所有Nginx内置变量请参考 http://nginx.org/en/docs/varindex.html 此页.

继续阅读“在nginx中通过map指令来正确添加请求头或修改头”