BIND結合NGINX+PHP實現DNS伺服器URL轉寄

來源:互聯網
上載者:User

標籤: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伺服器,可以用任何服務端語言編寫。

實現過程環境說明
  • 作業系統: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 {        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響應資訊。

  • 當類型為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 <[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轉寄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.