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
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转发相关推荐
- Linux-dns基础知识和BIND的简单配置-3(主从DNS服务器及转发)
rndc的相关知识: 1.什么是rndc: Remote Name Domain Controller,远程名称域控制器 rndc 通过一个 TCP 连接与名字服务器通信,发送经过数字签名认证的命令. ...
- dns服务器理论基础知识
一.什么是DNS DNS全称为Domain Name System,即域名系统,其作用就是将我们经常使用的"网址"解析为IP地址. 在互联网上通信需要借助于IP地址 ...
- 运维之DNS服务器Bind9配置解析和基础示例及附带命令
0x03 Bind 配置解析 实例1.DNS主从区域传输介绍与配置 实例2.DNS区域传输限制 实例3.DNS部分二级域名解析 示例1.采用Bind建立一个A记录DNS服务器 示例2.采用Bind建立 ...
- DNS概述和DNS服务器部署(详细正向解析)
文章目录 DNS概述和DNS服务器部署(正向解析) 一.简介 二.域名 2.1 域名层次结构 2.2 查询方式 2.3 DNS域名解析过程 三 .DNS服务器类型 四.DNS服务器部署 4.1.BIN ...
- linux:DNS服务器搭建(正向解析和反向解析)
目录 dns域名解析过程 实验开始准备 实验:正向解析 实验:反向解析 dns域名解析过程 文字描述 1.如在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否 ...
- Centos搭建dns服务器
文章目录 一.DNS服务器域名概述 二.搭建DNS环境 三.配置DNS服务器 1.安装DNS服务器 2.修改DNS主配置文件/etc/named.conf 3.新建正向区域文件 4.新建反向区域文件 ...
- Linux centos7 DNS服务器基于bind正反解析服务的搭建
Linux centos7 DNS服务器基于bind正反解析服务的搭建 DNS的相关基础知识: 一.DNS-- ...
- CentOS7.4下DNS服务器软件BIND安装及相关的配置(一)
(一)DNS简介: DNS,全称Domain Name System,即域名解析系统.域名是通过DNS来实现的,每个域名代表一个IP,DNS就是用来在ip地址与域名之间进行转换的服务. DNS帮助用户 ...
- redhat配置dns服务器bind
配置Oracle11g的RAC需要使用DNS服务器来解析SCAN IP,本文就是以此为例介绍bind服务器的使用.首先科普一下bind服务器,属于企业级产品了,还是开源的: Bind是Berkeley ...
最新文章
- 关于OUTLOOK 2007邮件无法打印的问题解决方法
- ssh证书登录(实例详解)
- IIS Permissions
- Django虚拟环境的安装和创建
- Python 内嵌函数运用(探究模块)
- java网络通信:异步非阻塞I/O (NIO)
- jdk卸载不干净怎么办_【实用】流氓软件卸载不干净?
- linux 文件格式压缩
- java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
- 比特币与莱特币的区别
- java web 调度_javaweb车辆调度信息管理平台
- centos7 安装mysql_第02期:ClickHouse 单机部署以及从 MySQL 增量同步数据
- 微信小程序上线,后台接口失效问题
- OV2640 DCMI
- 关于 类的常成员函数 声明和定义处 都需要加 const的原因
- 纽约州立大学石溪分校肖可瓅:数据驱动的金融研究
- Android在针式打印机上通过ESC/P指令打印二维码
- centos8重启网卡命令nmcli
- SpringBoot监控
- ajax提交成功清空表单,Ajax提交数据后,清空form表单