標籤:bind linux centos dns txt nginx
前幾天在公司分享會偶爾說起DNS,突然提到網域名稱電訊廠商提供的URL轉寄功能,即將指定的網域名稱轉寄到相關網域名稱,且可以在地址欄顯示或隱藏目標URL。爭論了很久,很多同學都認為是DNS伺服器自身提供了這個功能。眾所周知,DNS伺服器只提供網域名稱的解析功能,而URL轉寄是HTTP範疇,以下詳細說明下我自己的實現原理及過程。
原理
大多數網域名稱電訊廠商都會提供URL轉寄(國內此功能需要備案和審核)功能,分顯示和隱藏兩種。我們在實現的過程中分兩個環節,即DNS和HTTP。一個URL轉寄記錄對應DNS伺服器兩條記錄,分別為A或CNAME記錄和TXT記錄。A或CNAME記錄解析到自己的HTTP伺服器,以用於後面處理URL轉寄,這條記錄對使用者隱藏。TXT記錄是使用者在操作介面填寫的URL轉寄目標地址和類型。DNS解析完成之後交由HTTP伺服器,可以用任何服務端語言編寫。
實現過程環境說明
DNS伺服器
DNS伺服器由BIND搭建,通過yum直接安裝即可。下面截取主要的配置以供大家理解:
截取/etc/named.conf
options { listen-on port 53 { 127.0.0.1; }; directory "/var/named";};zone "ninjacn.com" IN { type master; file "ninjacn.com.zone";};
截取/var/named/ninjacn.com.zone
$TTL 3H@IN SOAninjacn.com. root.ninjacn.com. (0; serial1D; refresh1H; retry1W; expire3H ); minimumNS@A127.0.0.1u0A127.0.0.1u1A127.0.0.1u0TXT0|http://www.baidu.com/0.htmlu1TXT1|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響應資訊。
具體實現看以下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 <[email protected]> * 根據擷取到的主機名稱擷取相應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屬性指定。
[[email protected] ~]# curl -i u0.ninjacn.comHTTP/1.1 200 OKServer: nginx/1.10.1Date: Thu, 28 Jul 2016 19:31:40 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveX-Powered-By: PHP/5.3.3<iframe src=‘http://www.baidu.com/0.html‘></iframe>
隱藏URL - u1.ninjacn.com
HTTP狀態代碼為302,目標地址在回應標頭的Location屬性。
[[email protected] ~]# curl -i u1.ninjacn.comHTTP/1.1 302 Moved TemporarilyServer: nginx/1.10.1Date: Thu, 28 Jul 2016 19:36:59 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveX-Powered-By: PHP/5.3.3Location: http://www.baidu.com/1.html
(全文完)
本人水平有限,請指正、並請不吝賜教。轉載本站文章請註明作者和出處。
本文出自 “ninjacn” 部落格,請務必保留此出處http://ninjacn.blog.51cto.com/871512/1831739
BIND結合NGINX+PHP實現DNS伺服器URL轉寄