前几天在公司分享会偶尔说起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

options {listen-on port 53 { 127.0.0.1; };directory       "/var/named";
};
zone "ninjacn.com" IN {typemaster;file "ninjacn.com.zone";
};

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

$TTL 3H
@   IN SOA  ninjacn.com. root.ninjacn.com. (0   ; serial1D  ; refresh1H ; retry1W   ; expire3H )    ; minimumNS @A  127.0.0.1
u0  A   127.0.0.1
u1  A   127.0.0.1
u0  TXT 0|http://www.baidu.com/0.html
u1  TXT 1|http://www.baidu.com/1.html

共解析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块处理。

server {listen       80;server_name  _;location / {root   /usr/share/nginx/html;index  index.php;}location ~ \.php$ {fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;include        fastcgi_params;}
}

PHP实现转发

<?php
/*** @author ninjacn <x@ninjacn.com>* 根据获取到的主机名获取相应TXT记录,并返回相应信息*/define('TARGET_SHOW', 0); //显示urldefine('TARGET_HIDE', 1); //隐藏url
$hostname = $_SERVER['HTTP_HOST'];
$record = dns_get_record($hostname, DNS_TXT);list($type, $url) = array('', '');
if($record) {if(isset($record[0]['txt'])) {list($type, $url) = explode('|', $record[0]['txt']);}
}if(empty($type) && empty($url)) {exit(110);
}if($type == TARGET_HIDE) {header('Location: '.$url);
} elseif ($type == TARGET_SHOW) {$html = "<iframe src='".$url."'></iframe>";echo $html;
}

测试

显示url - u0.ninjacn.com

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

[root@localhost ~]# curl -i u0.ninjacn.com
HTTP/1.1 200 OK
Server: nginx/1.10.1
Date: Thu, 28 Jul 2016 19:31:40 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.3.3<iframe src='http://www.baidu.com/0.html'></iframe>

隐藏URL - u1.ninjacn.com

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

[root@localhost ~]# curl -i u1.ninjacn.com
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.10.1
Date: Thu, 28 Jul 2016 19:36:59 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.3.3
Location: http://www.baidu.com/1.html
(全文完)
本人水平有限,请指正、并请不吝赐教。转载本站文章请注明作者和出处。

BIND结合NGINX+PHP实现DNS服务器URL转发相关推荐

  1. Linux-dns基础知识和BIND的简单配置-3(主从DNS服务器及转发)

    rndc的相关知识: 1.什么是rndc: Remote Name Domain Controller,远程名称域控制器 rndc 通过一个 TCP 连接与名字服务器通信,发送经过数字签名认证的命令. ...

  2. dns服务器理论基础知识

    一.什么是DNS     DNS全称为Domain Name System,即域名系统,其作用就是将我们经常使用的"网址"解析为IP地址.     在互联网上通信需要借助于IP地址 ...

  3. 运维之DNS服务器Bind9配置解析和基础示例及附带命令

    0x03 Bind 配置解析 实例1.DNS主从区域传输介绍与配置 实例2.DNS区域传输限制 实例3.DNS部分二级域名解析 示例1.采用Bind建立一个A记录DNS服务器 示例2.采用Bind建立 ...

  4. DNS概述和DNS服务器部署(详细正向解析)

    文章目录 DNS概述和DNS服务器部署(正向解析) 一.简介 二.域名 2.1 域名层次结构 2.2 查询方式 2.3 DNS域名解析过程 三 .DNS服务器类型 四.DNS服务器部署 4.1.BIN ...

  5. linux:DNS服务器搭建(正向解析和反向解析)

    目录 dns域名解析过程 实验开始准备 实验:正向解析 实验:反向解析 dns域名解析过程 文字描述 1.如在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否 ...

  6. Centos搭建dns服务器

    文章目录 一.DNS服务器域名概述 二.搭建DNS环境 三.配置DNS服务器 1.安装DNS服务器 2.修改DNS主配置文件/etc/named.conf 3.新建正向区域文件 4.新建反向区域文件 ...

  7. Linux centos7 DNS服务器基于bind正反解析服务的搭建

                                                 Linux centos7 DNS服务器基于bind正反解析服务的搭建 DNS的相关基础知识: 一.DNS-- ...

  8. CentOS7.4下DNS服务器软件BIND安装及相关的配置(一)

    (一)DNS简介: DNS,全称Domain Name System,即域名解析系统.域名是通过DNS来实现的,每个域名代表一个IP,DNS就是用来在ip地址与域名之间进行转换的服务. DNS帮助用户 ...

  9. redhat配置dns服务器bind

    配置Oracle11g的RAC需要使用DNS服务器来解析SCAN IP,本文就是以此为例介绍bind服务器的使用.首先科普一下bind服务器,属于企业级产品了,还是开源的: Bind是Berkeley ...

最新文章

  1. 关于OUTLOOK 2007邮件无法打印的问题解决方法
  2. ssh证书登录(实例详解)
  3. IIS Permissions
  4. Django虚拟环境的安装和创建
  5. Python 内嵌函数运用(探究模块)
  6. java网络通信:异步非阻塞I/O (NIO)
  7. jdk卸载不干净怎么办_【实用】流氓软件卸载不干净?
  8. linux 文件格式压缩
  9. java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
  10. 比特币与莱特币的区别
  11. java web 调度_javaweb车辆调度信息管理平台
  12. centos7 安装mysql_第02期:ClickHouse 单机部署以及从 MySQL 增量同步数据
  13. 微信小程序上线,后台接口失效问题
  14. OV2640 DCMI
  15. 关于 类的常成员函数 声明和定义处 都需要加 const的原因
  16. 纽约州立大学石溪分校肖可瓅:数据驱动的金融研究
  17. Android在针式打印机上通过ESC/P指令打印二维码
  18. centos8重启网卡命令nmcli
  19. SpringBoot监控
  20. ajax提交成功清空表单,Ajax提交数据后,清空form表单

热门文章

  1. DMZ-demilitarized zone 隔离区
  2. c语言 字符输出要加 吗,最后的printf为什么要加&,他不是输出字符串吗
  3. 运动需要用到哪些东西,双十一好用的运动装备分享
  4. 设计模式之命令模式详解(附应用举例实现)
  5. 破解navicat试用期功能
  6. js设置ajax执行顺序,ajax同步处理(使得JS按顺序执行)
  7. 卡死 App 的神秘字符串,究竟是何方神圣(下)
  8. Python获取原图GPS位置信息,轻松得到你的活动轨迹!
  9. Linux Pycharm中文输入候选框跟随光标
  10. 反向拓扑排序 HDU 4857 逃生