Nginx之proxy_redirect详解

今天在做nginx反向代理apache的时候出了一点点问题,原来后端apache用的端口是8080通过反向代理后,使用wireshark抓包发现location头域数值为http://192.168.1.154:8080/wuman/  如果把这个返回给客户端肯定是不可以的,看起来别扭而且还暴露了apache的具体信息

所以在这里用到了nginx的proxy_redirect指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值

以下是截取nginx的一小段配置文档

server {
       listen       80;
       server_name  www.boke.com;
       location / {
            proxy_pass http://192.168.1.154:8080;
            proxy_redirect off;
       }
 }

此时我们通过curl查看结果得出

[root@localhost nginx]# curl -I http://www.boke.com/wuman
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 24 Dec 2015 12:02:00 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: http://192.168.1.154:8080/wuman/

这里location为带有后端服务器实际地址跟端口的响应头信息这样在实际线上是不允许的所以这里我们打算通过proxy_redirect将被代理服务器的响应头中的location字段进行修改后返回给客户端

server {
       listen       80;
       server_name  www.boke.com;
       location / {
            proxy_pass http://192.168.1.154:8080;
            proxy_redirect http://192.168.1.154:8080/wuman/  http://www.boke.com/wuman/;
       }

server {
       listen       80;
       server_name  www.boke.com;
       location / {
            proxy_pass http://192.168.1.154:8080;
            proxy_redirect ~^http://192.168.1.154:8080(.*)   http://www.boke.com$1;
       }

则curl查看返回结果

[root@localhost nginx]# curl -I http://www.boke.com/wuman
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 24 Dec 2015 12:08:34 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: http://www.boke.com/wuman/

此时查看location已经变成了我们想要的结果了。 此时通过replacement 301重定向到了我们新的页面
 

 

https://www.cnblogs.com/kevingrace/p/8073646.html

(更多点击链接)

在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改!!
语法:proxy_redirect [ default|off|redirect replacement ];
默认:proxy_redirect default;
配置块(使用的字段):http、server、location
当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时,proxy_redirect可以重设HTTP头部的location或refresh字段。

1

2

3

location /login {

    proxy_pass http://target_servers/login ;

}

如果需要修改从被代理服务器传来的应答头中的"Location"和"Refresh"字段,这时候就可以用proxy_redirect这个指令设置。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

假设被代理服务器返回Location字段为http://localhost:8000/kevin/some/uri/

  

proxy_redirect http://localhost:8000/kevin/ http://frontend/one/;

将Location字段重写为http://frontend/one/some/uri/

在代替的字段中可以不写服务器名:

 

proxy_redirect http://localhost:8000/kevin/ /;

这样就使用服务器的基本名称和端口,即使它来自非80端口。

如果使用"default"参数,将根据location和proxy_pass参数的设置来决定。

 

 

例如下列两个配置等效:

location /one/ 

proxy_pass       http://upstream:port/kevin/

proxy_redirect   default;

}

 

location /one/ 

proxy_pass       http://upstream:port/kevin/

proxy_redirect   http://upstream:port/kevin/   /one/;

}

 

在指令中可以使用一些变量:

proxy_redirect   http://localhost:8000/    http://$host:$server_port/;

 

这个指令有时可以重复:

proxy_redirect   default; 

proxy_redirect   http://localhost:8000/    /; 

proxy_redirect   ; 

/;

 

参数off将在这个字段中禁止所有的proxy_redirect指令:

proxy_redirect   off; 

 

利用这个指令可以为被代理服务器发出的相对重定向增加主机名:

下面通过几个小实例来体验下proxy_redirect的使用效果:
==============================================================================

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

假设当前nginx的访问地址为http://10.0.9:8080,如果kevin-inc又需要302到10.0.9/xxx

那么可以添加下redirect,将302的location改为http://10.0.9:8080/xxx

 

location /login {

            proxy_pass http://kevin-inc/login ;

            proxy_redirect http://10.0.9/ http://10.0.9:8080/;

        }

 

--------------------------------

host变量

如果不想写死ip地址,可以使用nginx的变量

 

location /login {

            proxy_pass http://kevin-inc/login ;

            proxy_redirect http://$host/ http://$http_host/;

        }

 

其中host不带端口的,也就是nginx部署的主机ip,而$http_host是带端口的

==============================================================================

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

server {

       listen       80;

       server_name  www.kevin.com;

       location / {

            proxy_pass http://10.0.8.40:9080;

       }

   }

 

这段配置一般情况下都正常,但偶尔会出错, 抓包发现服务器给客户端的跳转指令里加了端口号,如Location: http://www.kevin.com:9080/abc.html 。

因为nginx服务器侦听的是80端口,所以这样的URL给了客户端,必然会出错.

针对这种情况, 加一条proxy_redirect指令: proxy_redirect http://www.kevin.com:9080/ / ,即把所有"http://www.kevin.com:9080/"的内容替换成

"/"再发给客户端,就解决了。

 

server {

       listen       80;

       server_name  www.kevin.com;

       proxy_redirect http://www.kevin.com:9080/ /;

       location / {

            proxy_pass http://10.0.8.40:9080;

       }

   }

==============================================================================

1

2

3

4

5

6

7

8

9

10

11

12

前端的Nginx负责把http://www.kevin.com/grace/Server/开头的url反向代理到后端的http://10.0.8.40/Server/上。

对于有完整的路径,如http://www.kevin.com/grace/Server/的代理没有问题,Server对应后台服务器的一个目录。

 

但当访问http://www.kevin.com/grace/Server时,后端Nginx会发送一个301到/上,于是返回到前端后URL变成了http://www.kevin.com/Server/,这个url显然不是我们想要的。

 

在Apache中有个ProxyPassReverse的参数,用来调整反向代理服务器发送的http应答头的url,可以解决这个问题。

在Nginx代理配置,可以使用proxy_redirect这个参数,它实现的功能和ProxyPassReverse类似,例如增加如下配置:

 

location ^~ /grace  

    proxy_pass http://10.0.8.40/; 

    proxy_redirect http://www.kevin.com/ /grace/

<think>嗯,用户想了解如何正确配置Nginxproxy_pass指令。首先,我需要回忆一下关于proxy_pass的基本知识。proxy_pass是Nginx反向代理中的核心指令,用于将请求转发到后端服务器。根据之前看到的引用资料,斜杠的有无会影响URL的转发方式,这点很重要。 用户可能遇到的问题包括URL重写不正确,导致后端服务器收到错误的路径。比如,当location块匹配的路径和proxy_pass的URL是否以斜杠结尾时,处理方式不同。比如,引用[2]提到,添加或不添加斜杠会影响代理行为,需要详细说明。比如,如果location是/api/,而proxy_pass是http://backend/,那么请求的URI会被替换为backend后的路径,加上剩余部分。 另外,proxy_set_header和proxy_redirect这些指令也很重要,需要配置正确的头信息,确保后端服务器能获取真实的客户端IP,而不是Nginx的IP。引用[1]提到了这些相关指令,可能需要一并解释。 还要注意,当proxy_pass包含URI路径时,Nginx会拼接路径,并处理多余斜杠的问题,如引用[4]的情况一和情况二。需要举例说明不同配置下的结果差异,帮助用户理解。 用户可能还关心常见的配置错误,比如忘记添加斜杠导致404,或者头信息未正确传递。需要分点说明配置要点,比如斜杠处理、头信息设置、路径拼接规则等。同时,给出示例配置,让用户可以直接参考使用。 最后,可能需要提醒用户测试配置的正确性,使用curl或浏览器检查响应,确保代理行为符合预期。还要注意location匹配的优先级,比如精确匹配优先于前缀匹配,避免配置冲突。</think>### Nginxproxy_pass指令配置详解 #### 一、proxy_pass基本配置规则 proxy_pass指令用于将请求转发到后端服务器,其行为与斜杠(`/`)的使用密切相关: 1. **无斜杠结尾**:保留原始请求路径 例如: ```nginx location /api { proxy_pass http://backend; } ``` 请求`/api/data`会被转发为`http://backend/api/data`[^2][^4] 2. **有斜杠结尾**:截断location匹配部分 例如: ```nginx location /api/ { proxy_pass http://backend/; } ``` 请求`/api/data`会被转发为`http://backend/data`[^2] #### 二、关键配置要素 1. **头信息处理**(必须配置) ```nginx proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` 这些配置保证后端获取真实客户端信息[^1] 2. **路径重定向处理** ```nginx proxy_redirect default; ``` 自动修正后端返回的重定向响应头[^1] 3. **URI拼接规则** - 当proxy_pass包含URI路径时(如`http://backend/newpath/`),Nginx会拼接原始请求中超出location匹配的部分[^4] - 自动处理双斜杠问题,例如将`//`转为`/` #### 三、典型场景配置示例 1. **静态文件代理** ```nginx location /static/ { proxy_pass http://file_server/; proxy_cache my_cache; } ``` 2. **API接口代理** ```nginx location /api/v1/ { proxy_pass http://api_gateway/v1/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ``` #### 四、常见问题排查 1. **404错误检查** 使用`curl -v`验证代理后的完整URL是否符合预期 2. **头信息丢失** 确保配置了`proxy_set_header`并重启Nginx 3. **WebSocket代理失败** 需要额外配置: ```nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值