「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发
来源:编码之道     阅读:492
空军一号
发布于 2018-10-15 23:24
查看主页
「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发

前几天在公司分享会偶尔说起DNS,忽然提到域名经营商提供的URL转发功能,即将指定的域名转发到相关域名,且可以在地址栏显示或者隐藏目标URL。争论了很久,很多同学都认为是DNS服务器自身提供了这个功能。众所周知,DNS服务器只提供域名的解析功能,而URL转发是HTTP范畴,以下详细说明下我自己的实现原理及过程。

原理

大多数域名经营商都会提供URL转发(国内此功能需要备案和审核)功能,分显示和隐藏两种。我们在实现的过程中分两个环节,即DNS和HTTP。一个URL转发记录对应DNS服务器两条记录,分别为A或者CNAME记录和TXT记录。A或者CNAME记录解析到自己的HTTP服务器,以用于后面解决URL转发,这条记录对客户隐藏。TXT记录是客户在操作界面填写的URL转发目标地址和类型。DNS解析完成之后交由HTTP服务器,可以用任何服务端语言编写。

实现过程

环境说明

  • 操作系统:CentOS 6(Vagrant)
  • DNS服务器:BIND-9.8.2 (yum)
  • HTTP服务端:NGINX+PHP-FPM-5.3 (yum)
  • 测试域名:ninjacn.com

DNS服务器

DNS服务器由BIND搭建,通过yum直接安装就可。下面截取主要的配置以供大家了解:

截取/etc/named.conf

「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发

截取/var/named/ninjacn.com.zone

「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发

共解析2条URL转发(u0和u1),它们的A记录都对应自己的HTTP服务器,TXT记录对应真实的URL转发目标地址信息,TXT记录由2部分组成,由|分隔,左边部分为URL类型(显示或者隐藏),右边部分为真正的目标地址。

HTTP服务端

浏览器发起相关域名的请求之后,我们自己的服务器(DNS服务器A记录)会解决这个请求。服务端接受请求后会根据主机头向DNS服务器查询相应的TXT记录,获取到DNS记录之后根据类型(0代表显示URL,1代表隐藏URL)返回HTTP响应信息。

  • 当类型为0时,HTTP服务端返回301或者302状态码,响应头的Location是具体的URL目标地址。
  • 当类型为1时,HTTP服务端返回包含iframe的HTML信息。iframe的src属性为具体的URL目标地址。

具体实现看以下PHP代码。

Nginx配置文件

泛域名配置,所有请求都会由此server块解决。

「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发

PHP实现转发

「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发

测试

显示url?—?u0.ninjacn.com

HTTP状态码为200,不做转发解决,真正的网页地址在iframe的src属性指定。

「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发

隐藏URL?—?u1.ninjacn.com

HTTP状态码为302,目标地址在响应头的Location属性。

「系统架构」BIND结合NGINX+PHP实现DNS服务器URL转发


本文摘自medium.com,由编码之道编辑整理

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 软件环境
相关推荐
HTTPS究竟是个啥玩意儿?
Nginx负载均衡
思科裁员引程序员热议,百万良心赔偿令国内企业汗颜
寒冬里的互联网寒冬
3个Python编程中的难题,我给九种解法,你能想出多少种?
首页
搜索
订单
购物车
我的