文档章节

nginx处理redirect location端口丢失的问题

Feng_Yu
 Feng_Yu
发布于 2015/11/18 15:43
字数 770
阅读 1414
收藏 6
点赞 1
评论 1

前言

nginx有时候并不像apache那样智能,对于redirect location的处理尤为惨淡,几乎只能用户手工处理非标准端口的问题。

比如因为种种原因,nginx并不能监听在80端口,或者外部通过NAT方式将请求丢给nginx,外部地址并不是标准http(s)端口,此时nginx并不能美好的处理这些重定向。发生重定向的时候会丢失端口。

比如以下两种参考范例:

#反向代理
    listen 81 default_server;
    set $TOMCAT_HOME /var/lib/tomcat7;

    location / {
		root $TOMCAT_HOME/webapps/ROOT;
		proxy_pass http://127.0.0.1:8080/;
		proxy_set_header Host             $host;
		proxy_set_header X-Real-IP        $remote_addr;  
		proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
	}

# 访问/data的时候会自动加上/成为/data/
listen 81 default_server;

location /data {
    root /var/data;
}

浏览器请求的时候会发现只要发生重定向,端口号就会丢失,导致浏览器访问到错误的端口。

分别对这两种情况给出解决方案。

反向代理

这个很容易搞定,那一堆proxy_set_header不知道何时在网上流传开来的,几乎国内外文档无一例外都是这个鸟样子。后来我发现gitlab-ce这个用非标准端口访问是没有问题的,我看了一下gitlab-ce的nginx配置,发现是这么配置的:

proxy_set_header Host             $http_host;

我又发现nginx软件包释放出的配置文件(from ppa: NGINX Stable),发现里面其实是带有一个参考文件/etc/nginx/proxy_params

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

这里面写的也是 proxy_set_header Host $http_host;,于是乎直接include,搞定

    location / {
		root $TOMCAT_HOME/webapps/ROOT;
		proxy_pass http://127.0.0.1:8080/;
		include proxy_params;
	}

没这个文件就把这些内容手工敲到location配置段下。

再细看官方文档,其实也提及了:

An unchanged “Host” request header field can be passed like this:

    proxy_set_header Host       $http_host;

访问目录没带/

这个比较棘手,比如$document_root存在data/index.html文件,但是访问的时候最后没加/,nginx会自动给你带上/,返回一个301重定向(这个行为和apache一致),但是比较扯的地方在于,如果nginx监听的是非标准端口,这个301返回的Location没有端口号,导致浏览器请求出错。用curl可以很明显的看到这一点:

$ curl -v mydomain:81/data
* Hostname was NOT found in DNS cache
*   Trying *.*.*.*...
* Connected to mydomain (*.*.*.*) port 81 (#0)
> GET /test HTTP/1.1
> User-Agent: curl/7.35.0
> Host: mydomain:81
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
* Server nginx is not blacklisted
< Server: nginx
< Date: Wed, 18 Nov 2015 07:39:03 GMT
< Content-Type: text/html
< Content-Length: 178
< Connection: keep-alive
< Location: http://mydomain/data/
< 
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host mydomain left intact

可以很明显的看到Location没有端口号了,这个重定向又和反向代理不一样。于是遍寻google,最终在stackoverflow的问答中找到了解决方案:

        if (-d $request_filename) {
            rewrite [^/]$ $scheme://$http_host$uri/ permanent;
        }

通过手工对URL重写的形式带上端口。

© 著作权归作者所有

共有 人打赏支持
Feng_Yu
粉丝 153
博文 38
码字总数 45477
作品 0
西安
运维
加载中

评论(1)

z
zhaoheng
79
nginx做反向代理proxy_pass,proxy_redirect的使用

今天用nginx作为trac的反代,发现一个问题,就是登入登出跳转的时候是白页,看了下网页相应内容,发现相应的location是空的。查了一下发现是只单纯用了proxypass,没有使用proxyredirect. 假...

adbug ⋅ 2016/02/24 ⋅ 0

nginx redirect问题

本人nginx初学者,现在遇到问题,求大神解答。谢谢! 现在自己做的一个demo,希望把前端和后端分离,所以用nginx做转发,所有静态文件都放在D:workspaceapp目录下,后端服务器用的是tomcat,...

Jason.Xie ⋅ 2016/01/12 ⋅ 2

nginx 服务器访问很慢

各位大佬: 我的网络环境是这样的:nginx+tomcat 2个 其端口都受公司网关防火墙控制,现在公司的网关防火墙(以下简称防火墙)只开放了80端口,而后面tomcat的端口808和8080都没有开放。 问题...

2008 ⋅ 2011/07/24 ⋅ 3

搭建nginx+tomcat+Java的负载均衡环境

一、简介: Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。 ...

引鸩怼孑 ⋅ 2016/03/16 ⋅ 0

nginx反向代理访问很慢

各位大佬: 我的网络环境是这样的:nginx+tomcat 2个 其端口都受公司网关防火墙控制,现在公司的网关防火墙(以下简称防火墙)只开放了80端口,而后面tomcat的端口808和8080都没有开放。 问题...

2008 ⋅ 2011/07/24 ⋅ 3

Nginx怎么处理非对应端口的端口映射?

标题可能描述不清。详细描述一下我的场景。 由于ISP Ban掉了80端口,所以外网做端口映射的时候将81端口映射为内网ip的80端口。 Nginx的部分配置如下: server {listen 80 default_server;etag...

Feng_Yu ⋅ 2015/10/31 ⋅ 3

Nginx实现javaWeb项目动静分离

Nginx可以实现与Tomcat的耦合: 将静态页面请求交给Nginx,动态请求交给后端Tomcat处理。 将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功能进行多台Tomcat服务器的...

hello菜bird ⋅ 2016/06/02 ⋅ 0

Nginx 负载均衡

nginx支持http和tcp负载均衡。 http和tcp都可以配置多个server和后端服务器。 http和tcp负载均衡连接是在nginx上,每创建一个连接nginx都会创建连接到后端服务器,nginx只负责中转,类似ngi...

AaronSheng ⋅ 2016/11/02 ⋅ 0

nginx的反向代理模块 参数proxy_pass,proxy_method,proxy_hide_

nginx的反向代理模块有很多种配置,下面介绍一些常用的配置实例: 1.proxy_pass 语法:proxy_pass URL 配置块:location,if 详解:此配置项将当前请求反向代理到URL参数指定的服务器上,URL...

adbug ⋅ 2016/02/24 ⋅ 0

Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享 CentOS安装Nginx http://centoscn.com/CentosServer/www/2013/0910/1593.html CentOS安装Tomcat http://blog.csdn.net/zhuyinglinu......

Q317075064 ⋅ 2016/09/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 11分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 11分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 22分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 22分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 23分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 25分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 29分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 30分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 31分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 35分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部