文档章节

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

Feng_Yu
 Feng_Yu
发布于 2015/11/18 15:43
字数 770
阅读 1731
收藏 6

前言

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
粉丝 156
博文 38
码字总数 45571
作品 0
西安
运维
私信 提问
加载中

评论(1)

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

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

adbug
2016/02/24
1K
0
nginx redirect问题

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

Jason.Xie
2016/01/12
1K
2
nginx反向代理访问很慢

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

2008
2011/07/24
7.5K
3
搭建nginx+tomcat+Java的负载均衡环境

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

引鸩怼孑
2016/03/16
42
0
Nginx怎么处理非对应端口的端口映射?

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

Feng_Yu
2015/10/31
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
1
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
1
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
4
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
3
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部