การกำหนดโดเมนเนมหลายชื่อ โดยใช้ IP เดียว

            ในอดีตคงไม่มีใครจะคาดคิดกันว่า IP แอดเดรสที่มีอยู่มากมากนั้น ในปัจจุบันใกล้จะหมดไปอย่างรวดเร็วจากการเติบโตแบบก้าวกระโดดของอินเตอร์เน็ต วิธีการแก้ไขปัญหาสำหรับการขาดแคลน IP ในขณะนี้ นอกจากจะรอมาตรฐานใหม่ของ IP ที่ชื่อว่า IPV6 แล้ว ยังมีอีกวิธีการหนึ่ง ก็คือต้องหันมาใช้โดเมนแบบที่เรียกว่า Virtual Domain แทน
            สำหรับผู้ที่ใช้เอ็นทีเป็นเซิร์ฟเวอร์สำหรับอินเตอร์เน็ต หรืออินทราเน็ตนั้น การสร้างส่วนที่เรียกว่า Virtual Domain บนวินโดว์สเอ็นที เป็นเทคนิคที่ได้รับความนิยมอย่างมากในหมู่ผู้ใช้วินโดว์สเอ็นที เพราะสามารถตั้งชื่อโดเมนหลาย ๆ ชื่อกับหลาย ๆ IP ไว้ในเซิร์ฟเวอร์เครื่องเดียวกันได้ แต่การสร้าง Virtual Domain ในลักษณะนี้ก็ปรากฏว่าพบข้อบกพร่องเล็กน้อย เนื่องจากทั้งในเอ็นที 3.x และ 4.0 ในเอ็นที 3.x นั้น หากเราสร้าง Virtual Domain ขึ้นมาเมื่อไหร่ เราจำเป็นต้องใช้ IP address มากถึง 14 ตัว ซึ่งทางไมโครซอฟท์ก็ได้แก้ไขปัญหานี้โดยการออก Service Pack 5 มาให้ สำหรับในเอ็นที 4.0 เวอร์กสเตชันคือ จะรองรับ IP ได้ไม่เกิน 10 ตัว ซึ่งหากต้องการที่จะเพิ่ม IP เข้าไปมากกว่านี้ ก็จะต้องใช้ Moreover ของไมโครซอฟท์เข้ามาช่วย ยิ่งไปกว่านั้น การทำงานของเว็ปเซิร์ฟเวอร์ส่วนใหญ่ที่รันบนวินโดว์ส 95 หรือบนแมคอินทอชยังไม่สนับสนุนการทำงานที่มีหลาย IP เพราะฉะนั้นทางออกที่ดีที่สุดทางหนึ่งของการสร้าง Virtual Domain คือการกำหนดให้ชื่อโดเมนหลาย ๆ ชื่อเหล่านั้นแชร์ใช้ IP แอดเดรสตัวเดียวกัน
            โดทั่วไปการตั้งชื่อโดเมนหลาย ๆ ชื่อ เช่น abc.com และ xyz.com นั้น ตั้งขึ้นมาเพื่อให้ผู้ใช้ที่เข้ามาใน http://www.abc.com หรือ http://www.xyz.com ได้รับข้อมูลผ่านโฮมเพจที่แตกต่างกัน โดยจะแสดงเป็นโฮมเพจของบริษัท ABC และ XYZ ตามลำดับ ซึ่งแต่ละชื่อโดเมนจะมี IP ประจำชื่อเหล่านั้น และเทคนิคที่ผมจะขอแนะนำนี้ จะเป็นเทคนิคที่เราสามารถใช้ IP เพียง 1 ตัวสำหรับอ้างถึงชื่อโดเมนมากกว่า 2 ชื่อได้
            การทดสอบในด้านเทคนิค ผมใช้เอ็นทีเวอร์กสเตชัน และซอฟต์แวร์เว็ปเซิร์ฟเวอร์ Alibaba 2.0 ของ Computer Software Manufaktur แต่หากคุณใช้อินเตอร์เน็ตอินฟอร์เมชั่นเซอร์ฟเวอร์ ( IIS ) ของไมโครซอฟท์ หรือซอฟท์แวร์เว็ปเซอร์ฟเวอร์ตัวอื่นที่มีความสามารถใกล้เคียงกัน ก็สามารถใช้เทคนิคนี้ได้ โดยชื่อโดเมนที่ผมจะทดลองสร้างขึ้นมาจะมี 2 ชื่อ คือ abc.com และ xyz.com ส่วน IP ที่นำมาทดสอบนั้น คือ 207.68.156.100
Domain Name System : Name Server
ขั้นตอนแรกที่ต้องทำคือ ติดตั้ง Domain Name System ( DNS ) ซึ่งเป็น name server ลงในเน็ตเวอร์กของเราก่อน การที่จะให้ชื่อโดเมน 2 ชื่อใช้ IP แอดเดรสตัวเดียวกัน เราจะต้องตั้ง canonical name ( CNAME ) ขึ้นมาก่อน ( CNAME เป็นชื่อทางการของ system host และถูกกำหนดในแอดเดรส A ที่บันทึกอยู่ใน host ) ให้สร้าง CNAME สำหรับแต่ละโดเมนที่ใช้แอดเดรสร่วมกัน เมื่อ name server อ่านชื่อโดเมนเนม และพบ CNAME แล้ว เซอร์ฟเวอร์จะแทนที่ชื่อโดเมนเนมด้วย CNAME และเข้ามาทำงานในบรรทัดของ CNAME ถ้าเราใช้ซอฟท์แวร์ Berkeley Internet Name Domain(BIND) เป็น name server เราจะต้องเพิ่ม 2 บรรทัดข้างล่างนี้ลงในไฟล์ primary name
www.abc.com IN A 207.68.156.100
www.xyz.com IN CNAME www.abc.com
 โดยปกติแล้ว BIND จะรวมอยู่ในโอเอสที่เป็นยูนิกซ์อยู่แล้ว รวมทั้งเป็น DNS ที่ทำงานได้เป็นอย่างดีบนวินโดว์สเอ็นที 4.0 หลังจากที่เพิ่ม 2 บรรทัดด้านบนนี้แล้ว ให้เราเพิ่ม IP แอดเดรส 207.68.156.100 ลงไปในวินโดว์สเอ็นทีด้วย และเมื่อทดลองใช้คำสั่ง ping ดูที่ www.abc.com หรือ www.xyz.com เราจะต้องได้ผลลัพธ์กลับมาเหมือน ๆ กัน คือ Reply from 207.68.156.100

กำหนดรูตไดเรกตอรีของเอกสารเว็บ

 ไฟล์ต่าง ๆ ที่เราใช้นำเสนอผ่านเบราเซอร์ ไม่ว่าจะเป็นไฟล์ HTML, ไฟล์ภาพ หรือไฟล์อื่น ๆ นั้น เราเรียกรวม ๆ กันว่า เอกสารเว็บ และจะต้องเก็บบันทึกไฟล์เหล่านี้ไว้ในไดเรกตอรีใด ไดเรกตอรีหนึ่งบนเซอร์ฟเวอร์ สำหรับ IP แอดเดรส 207.68.156.100 นั้น หากสร้างรูตไดเรกตอรีของเอกสารเว็บไว้ที่ C:\ เราต้องสร้างซับไดเรกตอรีไว้ 2 ซับไดเรกตอรี คือ e:\abc และ e:\xyz สำหรับโดเมน abc.com และ xyz.com ตามลำดับ ส่วนโฮมเพจของทั้ง 2 บริษัทนี้ ก็ให้บันทึกลงในแต่ละไดเรกตอรีแยกกัน ยกตัวอย่าง เช่น บริษัท ABC สามารถสร้างไดเรกตอรีย่อย e:\abc\images เพื่อเก็บภาพต่าง ๆ ทั้งหมดที่ต้องการใช้ในโฮมเพจของบริษัท ABC และจะต้องสร้างไฟล์โฮมเพจ index.htm ( สำหรับเป็นไฟล์เริ่มต้นที่ผู้ใช้จะได้พบ เมื่อเข้ามายังเว็บเซอร์ฟเวอร์ ) เพื่อบันทึกลงในรูตไดเรกตอรีของเอกสารเว็บ ( e:\ ) ดังนั้น เมื่อผู้ใช้ที่เป็น http://www.abc.com หรือ http://www.xyz.com เขาจะเห็นโฮมเพจหน้าเดียวกัน

หลังจากที่สร้างโดเมนเนม 2 ชื่อบน IP ตัวเดียวกัน พร้อมทั้งกำหนดไดเรกตอรีของไฟล์ index.htm แล้ว สิ่งที่จะต้องทำต่อไปคือการสร้างโฮมเพจของแต่ละโดเมน เมื่อผู้ใช้เข้ามาที่ http://www.abc.com หรือ http://www.xyz.com ก็จะเห็นโฮมเพจของทั้ง 2 บริษัทที่แตกต่างกัน การแสดงโฮมเพจที่ต่างกัน สำหรับ 2 URL ( Universal Resource Locators ) ที่ไม่เหมือนกันนั้น จะมีเทคนิคง่าย ๆ อยู่ 2 วิธี คือ

การใช้ CGI

วิธีแรก ก็คือการใช้สคริปต์ Common Gatway Interface ( CGI ) เพื่อตอบรับการเรียกอ่านข้อมูลของผู้ใช้ โดยจะใช้เทคนิคที่เรียกว่า client-pull ซึ่งเบราเซอร์จะรีโหลดเพจปัจจุบัน หรืออาจจะโหลดเพจหน้าอื่นหลังจากผ่านเวลาที่เรากำหนดไว้ ดังนั้นเว็บเพจที่นำเสนอบนเบราเซอร์ จะเปลี่ยนไปโดยอัตโนมัติ โดยผู้ใช้ไม่ต้องกระทำการใด ๆ บนเบราเซอร์หรือเว็บเพจเลย ดังนั้นด้วยเทคนิคการโหลดเพจแบบอัตโนมัตินี้ เราสามารถกำหนดให้เบราเซอร์โหลดไฟล์ CGI ที่เขียนสคริปต์ไว้สำหรับจัดส่งโฮมเพจที่ถูกต้องตามโดเมนที่ผู้ใช้ต้องการกลับไปยังผู้ใช้

การให้เบราเซอร์โหลด CGI โดยอัตโนมัตินั้น จะต้องเขียนแท็กเพิ่มเติมลงในส่วนต้นของไฟล์ index.htm ใน e:\ ดังนี้

<html>
<head>
 <meta http-equiv="Refresh" content=" 0;url=/cgi-bin/referer.exe">
<title>testing</title>
</head>
</html>

โดย content = " 0 " เป็นส่วนที่ใช้กำหนดเวลาในการโหลดไฟล์ CGI ต่อจากไฟล์ index.htm มีหน่วยเป็นวินาที ซึ่งถ้ามีค่าเป็น 0 จะหมายถึงการโหลดไฟล์ CGI หลังจากที่โหลดไฟล์ index.htm ผ่านไป 0 วินาที ซึ่งก็หมายถึงให้โหลดไฟล์นั้นทันที ส่วนไฟล์ referer.exe เป็นไฟล์ execute ของ CGI สคริปต์ที่คอมไพล์มาจากซอร์สโค้ดภาษาซี ( referer.c ) ใน listing 1 เพื่อโหลดโฮมเพจที่ถูกต้องของโดเมนที่ต้องการให้กับผู้ใช้

ในประโยคคำสั่ง ( statement ) ของ listing 1
getenv("HTTP_REFERER");

 จะ return ค่าเป็น link ที่ได้มาจากการทำงานของ CGI สคริปต์ ส่วนฟังก์ชัน strstr() จะใช้ในการค้นหา substring ที่มีอยู่ และ return ค่า NULL ถ้าไม่พบ substring นั้น จากขั้นตอนต่าง ๆ เหล่านี้ คำสั่ง Refresh จะแสดงโฮมเพจที่ถูกต้อง ดังตัวอย่าง เช่น

 printf("Refresh: 0; URL=http://www.xyz.com/xyz/index.htm\n\n");

ซึ่งเป็นการโหลด URL http://www.xyz.com/index.htm หลังจาก 0 วินาทีผ่านไป ซึ่งหมายถึงการโหลด URL นี้ทันที

 วิธีนี้เป็นวิธีง่าย ๆ ในการแสดงโฮมเพจที่ถูกต้องให้กับผู้ใช้ เราสามารถที่จะปรับแก้ไขโค้ดที่ให้มานี้ได้ ตามจำนวนของ URL ที่เหมาะสมหากมี URL หลายตัว ตัวอย่างเช่น เราสามารถนำ URL ทั้งหมดใส่ลงใน table และใช้เทคนิคการค้นหา URL แบบธรรมดา เช่นการค้นหาแบบ hashing หรือแบบ binary เพื่อการหาข้อมูลใน table ได้เร็วขึ้น แต่ปัญหาของวิธีนี้คือเบราเซอร์ส่วนใหญ่ในขณะนี้ ยังทำงานในรูปแบบของ client-pull หรือการโหลดไฟล์โดยอัตโนมัติไม่ได้ ดังนั้นในการเรียกใช้ CGI สคริปต์ อาจจะต้องทำเป็นลิงก์ในไฟล์ index.htm แทน ซึ่งจะต้องแก้ไขส่วนของแท็ก META เป็น

<html>
<a href="\cgi-bin\referer.exe ">Please click here</a>
</html>

และเมื่อผู้ใช้มาที่ http://www.abc.com หรือ http://www.xyz.com ไฟล์ index.htm จะแสดงขึ้นมาบนเบราเซอร์ พร้อมมี link ข้อความ Please click here ปรากฏขึ้น ซึ่งผู้ใช้จะต้องคลิกที่ลิงก์นี้ก่อน เพื่อเป็นการเรียกใช้งาน CGI สคริปต์ หรืออาจจะใช้แท็ก <meta HTTP_EQUIV> ในหน้า HTML เพื่อโหลดเพจใหม่ ถ้าหากคุณต้องการให้ขั้นตอนต่าง ๆ เหล่านี้ทำงานได้แบบอัตโนมัติภายใต้เบราเซอร์ คุณก็สามารถทำได้เช่นกัน จากการใช้จาวาสคริปต์

 จาวาสคริปต์ เป็นคำสั่งที่เราสามารถเพิ่มลงในเพจ HTML และให้คำสั่งเหล่านั้นทำงานได้ทันทีเมื่อเพจนั้นแสดงขึ้นมาบนเบราเซอร์ ดังนั้นเราสามารถใช้จาวาสคริปต์แสดงโฮมเพจของโดเมนตามที่ผู้ใช้ต้องการได้ นอกจากนี้จาวาสคริปต์ยังทำงานได้เป็นอย่างดีบนเบราเซอร์ที่เป็นที่นิยม ทั้งอินเตอร์เน็ตเอ็กซ์พลอเรอร์ 3.0 และ เน็ตสเคปเนวิเกเตอร์ 2.0 ขึ้นไป เบราเซอร์จะโหลดคำสั่งจาวาสคริปต์ ซึ่งเป็นส่วนหนึ่งของไฟล์ HTML และทำคำสั่งเหมือนกับการดาวน์โหลดสคริปต์ ดังนั้น สคริปต์สามารถสร้างเว็บเพจแบบไดนามิกได้ ใน listing 2 เป็นโค้ดจาวาสคริปต์ที่แสดงโฮมเพจของโดเมนเนมที่ผู้ใช้ต้องการ ให้เรานำโค้ดนี้ไปเขียนไว้ที่ไฟล์ index.htm ในรูตไดเรกตอรีของเว็บเซอร์ฟเวอร์

เมื่อเบราเซอร์ดาวน์โหลดไฟล์ index.htm จะมีการทำงาน คำสั่งในจาวาสคริปต์ที่คำสั่ง go() ซึ่งต่อไปจะเรียกว่าฟังก์ชัน go() ฟังก์ชันนี้จะไปเรียก URL link ที่ถูกต้อง ภายในฟังก์ชันจะมีตัวแปร location.href ซึ่งจะเก็บค่าของ URL ที่ผู้ใช้เรียกดู ( เช่น http://www.abc.com/index.htm หรือ http://www.xyz.com/index.htm ) และมีการเปรียบเทียบกับตัวแปร x ผมได้กำหนดให้ x เป็น string ที่มีค่าเป็น http://www.r ซึ่งเป็น string ที่มีค่าอยู่ระหว่าง http://www.abc.com และhttp://www.xyz.com ดังนั้น ถ้า location.href มีค่ามากกว่า x ค่า URL ที่ได้คือ http://www.xyz.com มิฉะนั้นก็จะเป็น http://www.abc.com

 หลังจากที่ได้ URL ที่ถูกต้องแล้ว เราสามารถกำหนดให้เบราเซอร์ไปยังโฮมเพจที่ถูกต้องได้ โดยกำหนดลิงก์ของ URL นั้นลงใน location.href เช่นคำสั่งต่อไปนี้

location.href=http://www.abc.com/index1.htm

 จะสั่งให้เบราเซอร์ดาวน์โหลดไฟล์ index1.htm โดยอัตโนมัติ ไฟล์นี้ ( index1.htm ) จะเป็นโฮมเพจแรกของบริษัท abc.com ( เราสามารถใส่ index.htm ลงในซับไดเรกตอรี e:\abc ได้ และใช้คำสั่งเป็น location.href="http://www.abc.com/abc/index.htm" ) สคริปต์นี้จะช่วยให้เราสร้าง virtual domain ได้จาก IP แอดเดรสเพียงตัวเดียว และเพียงแต่ผู้ใช้ ใช้เบราเซอร์ที่รันจาวาสคริปต์ได้ ก็จะสามารถอ่านโฮมเพจของ URL ตามที่ต้องการได้อย่างปกติ เหมือนกับการเซ็ต virtual domain แบบหลาย IP ทุกประการ

 วิธีการนี้สามารถใช้งาน ถ้าเบราเซอร์ของคุณสนับสนุนการทำงานของจาวาสคริปต์ แต่หากเบราเซอร์ที่คุณใช้อยู่มีปัญหาในเรื่องนี้ คุณก็สามารถจะเปลี่ยนเป็นการใช้ขั้นตอนของ CGI แทนได้ ในยุคที่ IP มีอยู่อย่างจำกัด และต้องใช้อย่างประหยัดที่สุด เทคนิคอันนี้น่าจะเป็นเทคนิคที่เหมาะสมที่สุด

 LISTING 1 : สคริปต์ในส่วนของภาษา C

/* referer.c */
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *referer;
printf("Content-type: text/html \n");
referer = getenv("HTTP_REFERER");
if (strstr(referer, "abc.com") !=NULL )
printf("Referer: 0; URL=http:/www.abc.com./abc/index.htm\n\n");
else if (strstr(referer, "xyz.com") !=NULL)
printf("Referer: 0; URL=http:/www.xyz.com./xyz/index.htm\n\n");
}
}

LISTING 2 : โค้ดในส่วนของ Javascript

<HTML>
<HEAD>
<TITLE>Testing</TITLE>
<SCRIPT LANGUAGE="JAVASCRIPT">
function go() {
var x;
x="http:/www.r";
if(Location.href > x ) {
Location.href="http://www.xyz.com/index0.htm";
}
else {
Location.href="http://www.abc.com/index1.htm";
}
}
</SCRIPT>
</HEAD>
 <BODY>
<SCRIPT LANGUAGE="JAVASCRIPT">
go();
</SCRIPT>
</BODY>
</HTML>



16 ตุลาคม 2540

| home | menu | เทคโนโลยี |

1 : 08 : 2541