เรื่องนี้อาจจะเก่าสำหรับหลายๆคน แต่สำหรับผมแล้วเป็นเรื่องใหม่ เพราะเมื่อสองสามวันมานี้เกิดคำถามกับตัวเองว่า ถ้าเราต้องการใช้งาน proxy เฉพาะบางเวป และเวปที่อื่นๆให้ออกตรงโดยไม่ต้องผ่าน proxy สามารถทำได้ไหม ผมก็เลยค้นๆดูปรากฏว่าพบซิธีทำ proxy autoconfig ซึ่งมันดูน่าสนใจ พอดูๆแล้วปรากฏว่าตอบโจทย์ที่ต้องการพอดี

ไม่ใช่แค่ตอบสนองความต้องการของผม แต่เราสามารถนำวิธีการนี้ไปใช้ร่วมกับองค์กรณ์เพื่อกำหนดให้ user ต่างๆ สามารถใช้งาน proxy ตัวไหนได้โดยไม่จำเป้นต้องไปเดิน set ให้เมื่อยขา เพราะว่า วิธีการนี้สามารถนำไปใช้งานร่วมกับ DHCP หรือ Active directory อีกด้วย

วิธีการไม่มีอะไรยากมากเหมือนเขียนโปรแกรม และมีฟังค์ชั้นที่ใช้งานไม่มากนัก โดยโครงสร้างเริ่มต้นเป็นดังนี้

function FindProxyForURL(url, host)
{
  ...
}

เมื่อเรารู้โครงสร้างเริ่มต้นแล้ว ก้มารู้จักกับ function สักตัวสองตัวที่คิดว่าจำเป็นสำหรับการสร้างไฟล์ proxy client autoconfig

  1. shExpMatch(str หรือ url หรือ host, shexp)
  2. str คือ string ที่เอาไว้ compare
    url และ host จะรับค่ามาจาก funtion FindProxyForURL
    shexp คือ expreesion นำมา compare โดยสามารถใช้ wildcard ได้ด้วย
    จะให้ค่าเป็น true ในกรณีที่ค่าทั้งสอง match กัน
    ตัวอย่าง เช่น
    shExpMatch(“http://w3.ezylinux.com/website1/index.html”, “*site1*”) จะให้ค่าเป็น true
    shExpMatch(host, “*.ezylinux.com”) เมื่อมีการ request เพื่อเวป ezylinux.com จะให้ค่าเป็น true

  3. isInNet(host, pattern, mask)
  4. host จะรับค่ามาจาก funtion FindProxyForURL โดยเมื่อรับมาแล้วจะใช้ DNS เพื่อ resolve หา IP อีกที
    pattern คือ IP Address
    mask คือ subnet mask
    ตัวอย่าง เช่น
    isInNet(host, “198.95.249.79”, “255.255.255.255”) ให้ค่า true ถ้าเครื่องเป็น 198.95.249.79
    isInNet(host, “198.95.0.0”, “255.255.0.0”) ให้ค่า true ถ้าเครื่องอยู่ในวง 198.95.0.0

การ return ค่า สามารถทำได้ 3 อย่างด้วยกันดังนี้

  1. DIRECT ให้ไม่ต้องผ่าน proxy
  2. PROXY host:port ให้ใช้ proxy ที่ host และ port ที่ระบุไว้
  3. SOCKS host:port ให้ใช้ proxy ที่ host และ port ที่ระบุไว้

ตัวอย่างการใช้งาน (proxy.pac)

function FindProxyForURL(url, host)
{
   if (isInNet(host, "192.168.0.0", "255.255.0.0")) { //อยู่ในวง 192.168.0.0 หรือไม่
      return "DIRECT";
   } else {
      if (shExpMatch(host, "*.ezylinux.com")) // จะเข้าเวป ezylinux.com หรือไม่
         return "DIRECT" ;
      else if (shExpMatch(url, "http:*"))   // เข้าเวปด้วย http หรือ port 80
         return "PROXY webcache.ezylinux.com:3128" ;
      else if (shExpMatch(url, "https:*"))  //เข้าเวปด้วย https หรือ port 443
         return "PROXY webcache.ezylinux.com:3128" ;
      else if (shExpMatch(url, "ftp:*"))   // เข้าใช้งาน ftp หรือ port 21
         return "PROXY webcache.ezylinux.com:3128" ;
      return "DIRECT";
   }
}

เมื่อได้ไฟล์ config แล้วเราสามารถวางไว้ได้ทั้ง เครื่องตัวเอง หรือ วางไว้ที่เครื่อง server (web server) โดย

  • กรณีที่วางไว้ที่เครื่องตัวเองให้ใช้ file:///c:/users/tum/proxy.pac
  • กรณีที่วางไว้ที่ server ให้ใช้ http://www.ezylinux.com/proxy.pac แล้วอย่าลืม AddType ตามตัวอย่างด้านล่าง
    AddType application/x-ns-proxy-autoconfig .pac

ซึ่งจะนำไปใส่ไว้ที่ URL ตั้งค่าพร๊อกซี่อัตโนมัติ ในส่วนของการ set ค่า proxy สำหรับ firefox และ นำไปใส่ไว้ที่ Use automatic configuration script ในส่วนของการ set ค่า proxy สำหรับ IE ดังตัวอย่าง

pac-config

pac-config-ie