Nginx反向代理中使用proxy_redirect重定向url

简介:

在使用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.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.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.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.40/; 
     proxy_redirect http: //www .kevin.com/  /grace/ ; 
} 

==============================================================================
如下启用了proxy_redirect配置(http->https),配置中就不需要"proxy_set_header Host $host;",即不需要"添加发往后端服务器的请求头"的配置了

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
[root@external-lb01 ~] # cat /data/nginx/conf/vhosts/443-www.kevin.com.conf.bak
upstream scf_cluster {
     ip_hash;
     server 192.168.10.20:9020;
     server 192.168.10.21:9020;
     }
upstream portal_cluster {
     ip_hash;
     server 192.168.10.20:9040;
     server 192.168.10.21:9040;
     }
upstream file_cluster{
     ip_hash;
     server 192.168.10.20:9020;
     }
upstream workflow_cluster{
     ip_hash;
     server 192.168.10.20:9020;
     server 192.168.10.21:9020;
     }
upstream batch_cluster{
     server 192.168.10.20:9020;
     server 192.168.10.21:9020;
     }
  
server {
         listen       443;
         server_name  www.kevin.com;
  
         ssl on;
         ssl_certificate  /data/nginx/conf/ssl/kevin .cer;
         ssl_certificate_key  /data/nginx/conf/ssl/kevin .key;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_session_cache    shared:SSL:1m;
         ssl_session_timeout  5m;
         ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
         ssl_prefer_server_ciphers  on;
  
         access_log   /data/nginx/logs/www .kevin.com-access.log main;
         error_log   /data/nginx/logs/www .kevin.com-error.log;
  
         error_page   500 502 503 504   /50x .html;
         location =  /50x .html {
             root   html;
         }
  
  
         location  /scf  {
             proxy_pass http: //scf_cluster/scf ;
             proxy_redirect  http: //scf_cluster/scf  https: //www .kevin.com /scf ;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 300;
             proxy_send_timeout 300;
             proxy_read_timeout 600;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
             proxy_max_temp_file_size 128m;
  
         }
  
  
        location / {
             proxy_pass http: //portal_cluster/portal-pc/ ;
             proxy_redirect  http: //portal_cluster/portal-pc/  https: //www .kevin.com/;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 300;
             proxy_send_timeout 300;
             proxy_read_timeout 600;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
             proxy_max_temp_file_size 128m;
  
         }
  
         location  /msdp-file  {
             proxy_pass http: //file_cluster/msdp-file ;
             proxy_redirect  http: //file_cluster/msdp-file  https: //www .kevin.com /msdp-file ;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 300;
             proxy_send_timeout 300;
             proxy_read_timeout 600;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
             proxy_max_temp_file_size 128m;
  
         }
          
     location  /upload  {
             proxy_pass http: //file_cluster/upload ;
             proxy_redirect  http: //file_cluster/upload  https: //www .kevin.com /upload ;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 300;
             proxy_send_timeout 300;
             proxy_read_timeout 600;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
             proxy_max_temp_file_size 128m;
  
         }
          
         location  /activiti-workflow-console  {
             proxy_pass http: //workflow_cluster/activiti-workflow-console ;
             proxy_redirect  http: //workflow_cluster/activiti-workflow-console  https: //www .kevin.com /activiti-workflow-console ;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 300;
             proxy_send_timeout 300;
             proxy_read_timeout 600;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
             proxy_max_temp_file_size 128m;
  
         }
     location  /batch-framework-web  {
             proxy_pass http: //batch_cluster/batch-framework-web ;
             proxy_redirect  http: //batch_cluster/batch-framework-web  https: //www .kevin.com /batch-framework-web ;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_connect_timeout 300;
             proxy_send_timeout 300;
             proxy_read_timeout 600;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
             proxy_max_temp_file_size 128m;
  
         }
}
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/8073646.html,如需转载请自行联系原作者
相关文章
|
监控 NoSQL 算法
百万级URL重定向工程:大规模网站架构设计与性能优化实战
本文深入探讨了大规模重定向系统的核心挑战与解决方案,涵盖技术瓶颈分析、分布式架构设计、十亿级URL处理策略、全球化部署方案及全链路监控体系。通过数学建模与性能优化,提出三层架构模型,并结合一致性哈希分片算法实现高效路由。同时,对比不同架构的吞吐量与容灾能力,分享某电商平台实践案例,展示性能显著提升。最后展望重定向即服务(RaaS)未来趋势,包括AI动态路由、量子安全跳转和边缘智能等关键技术,为企业提供扩展性强、稳定性高的系统设计参考。
607 25
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
873 61
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
1070 60
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
1165 60
|
缓存 负载均衡 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
2617 20
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
710 11
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
838 5
|
Web App开发 应用服务中间件 nginx
nginx配置中proxy_redirect的作用(转)
来自http://wntest.ustc.edu.cn/mine/wordpress/?p=400 及 http://hi.baidu.com/171892549/blog/item/0ec6aaef22acbb1dfdfa3ca7.html NGINX的proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改。以例子说明:    server {        lis
5467 0
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
1231 87
|
编解码 应用服务中间件 Linux
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
835 1