Nginx代理配置:将子路径(点换横杠的IP)映射至目标URL
用Nginx的location和proxy_pass实现带横杠IP的URL转发
嘿,这个需求其实用Nginx的正则location配合变量替换就能轻松搞定,我来给你一步步拆解怎么做:
核心思路
我们需要通过正则location捕获URL中用横杠分隔的IP段,然后将横杠替换为点号拼接成真实的目标IP,最后用proxy_pass把请求转发到这个目标IP的服务器上。
基础配置(仅处理根路径请求)
如果你的请求都是形如http://example.com/10-10-43-3这种不带子路径的格式,用下面的配置就够了:
server { listen 80; server_name example.com; # 匹配形如 /xxx-xxx-xxx-xxx 的URL,捕获四个IP段 location ~ ^/([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)$ { # 将捕获的四个数字段用点号拼接成目标IP set $target_ip "$1.$2.$3.$4"; # 转发请求到目标IP的HTTP服务 proxy_pass http://$target_ip; # 可选:传递必要的请求头,确保目标服务能正确处理请求 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 可选:处理目标服务不可达的情况 proxy_connect_timeout 5s; proxy_intercept_errors on; error_page 502 503 504 /error.html; } }
扩展配置(支持带子路径的请求)
如果需要处理http://example.com/10-10-43-3/api/get-data这种带子路径的请求,只需要调整正则表达式,把后面的子路径也捕获并转发:
server { listen 80; server_name example.com; # 匹配带子路径的URL,捕获IP段和后续路径 location ~ ^/([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)(.*)$ { set $target_ip "$1.$2.$3.$4"; # 将子路径(第5个捕获组$5)一起转发到目标服务器 proxy_pass http://$target_ip$5; # 其他请求头配置同上 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
重要注意事项
- 正则匹配优先级:Nginx中正则location的优先级高于前缀location,如果你的配置里还有其他
location规则,要确保这个正则location不会被其他规则覆盖。 - IP合法性校验:上面的简单正则只是匹配数字和横杠,没有校验IP段是否在0-255的合法范围内。如果需要严格校验,可以把每个数字分组替换成
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),比如:location ~ ^/((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)-){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ { # 内部逻辑同上 } - 端口扩展:如果目标服务器使用非80端口,比如8080,可以修改URL规则为
/10-10-43-3-8080,然后在正则里捕获端口部分,拼接成http://$target_ip:$target_port进行转发。
内容的提问来源于stack exchange,提问作者xfdywy
相关产品推荐
相关产品推荐

