ไวยากรณ์ PAC (Proxy auto-config)
หากเอกสารมีข้อผิดพลาดหรือมีข้อเสนอแนะ โปรดฝากข้อความในฟอรัม Mudfish (https://forums.mudfish.net) ตัวอย่างและคำอธิบายในเอกสารนี้จัดทำโดยแปลหรืออ้างอิงเนื้อหาจากเว็บไซต์ด้านล่าง
ส่วนขยายเบราว์เซอร์ Mudfish รองรับรูปแบบไฟล์ PAC (Proxy auto-config)
ฟังก์ชัน PAC
เบราว์เซอร์ที่รองรับรูปแบบ PAC โดยทั่วไปจะรองรับฟังก์ชันที่ระบุในรูปแบบมาตรฐานที่ Netscape กำหนด
อย่างไรก็ตาม ฟังก์ชันเหล่านี้มักทำงานใน sandbox จึงทำงานภายใต้สภาพแวดล้อมที่จำกัดอย่างเข้มงวด เช่น ไม่สามารถตรวจสอบข้อมูล User Agent ได้เลย
ด้านล่างอธิบายฟังก์ชันที่อนุญาตให้ใช้ใน sandbox
dnsDomainIs
ตรวจสอบ hostname และคืนค่า true หากตรงกัน โดยทั่วไปใช้ตรวจสอบ hostname เฉพาะที่ต้องการยกเว้น
// 만약 hostname 이 google.com 과 같거나 하위 주소들이 매치된다면
// (예를 들어 maps.google.com, www.google.com),
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (dnsDomainIs(host, "google.com"))
return "DIRECT";
shExpMatch
เปรียบเทียบ hostname หรือ URL กับสตริงที่กำหนดด้วยรูปแบบ shell และคืนค่า true หากตรงกัน
// 모든 request 들 (.local 로 끝나는 모든 hostname 에 해당) 이
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (shExpMatch(url, "*.local"))
return "DIRECT";
// vpn.domain.com 에 접속할려고 하거나
// http://abcdomain.com/folder/ 하위의 모든 폴더 혹은 파일에 접속하는
// 요청들을 proxy 경유없이 직접 접속합니다.
if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
isInNet
ฟังก์ชันนี้ตรวจสอบที่อยู่ IP ของ hostname และคืนค่า true หากอยู่ใน subnet ที่ระบุ หากส่ง hostname เป็นอาร์กิวเมนต์ จะแปลงเป็น IP ผ่านการค้นหา DNS
// 만약 요청한 hostname 의 IP 주소가 (DNS resolving 후) 인자로 넘겨진
// IP 대역에 포함되는 것이면 직접 접속합니다.
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
คืนค่าที่อยู่ IP ปัจจุบันของคอมพิวเตอร์ของคุณ
// 만약 나의 컴퓨터가 특정 IP 대역에 속할 경우 proxy 10.10.5.1 (포트는 8080)
// 를 통해 요청하도록 합니다.
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "PROXY 10.10.5.1:8080";
dnsResolve
แปลง hostname เป็นที่อยู่ IP ผ่านการค้นหา DNS
// 만약 요청한 host 의 IP 가 지정한 범위에 속할 경우 직접 접속하도록
// 합니다.
if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";
isPlainHostName
คืนค่า true หาก hostname ไม่มีอักขระ . (จุด) เช่น http://intranet โดยทั่วไปใช้เมื่อเข้าถึงที่อยู่เว็บในเครือข่ายภายใน
// 만약 사용자가 plain hostname (예를 들면, http://intranet/ 혹은
// http://webserver-name01/) 를 요청할 경우, 직접 접속하도록 합니다.
if (isPlainHostName(host))
return "DIRECT";
localHostOrDomainIs
ตรวจสอบ hostname และคืนค่า true หากส่วน hostname ตรงกัน
// 만약 요청한 hostname 이 "www" 혹은 "www.google.com" 일 경우, 직접
// 접속합니다.
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";
isResolvable
แปลง hostname เป็นที่อยู่ IP และคืนค่า true หากสำเร็จ
หากการค้นหาที่อยู่โดเมนไม่สำเร็จ เบราว์เซอร์อาจค้างชั่วคราว โปรดใช้อย่างระมัดระวัง
// 만약 요청한 hostname 이 DNS 서버로 부터 resolving 이 될 수 있다면,
// proxy1.example.com 프록시를 통해 요청합니다.
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";
dnsDomainLevels
ตรวจสอบ hostname และคืนค่าจำนวน . (จุด) ในสตริงนั้น เช่น ใช้กำหนดข้อยกเว้นสำหรับเว็บเซิร์ฟเวอร์ในเครือข่ายภายใน
// 만약 hostname 이 . (dot) 을 하나라도 포함하고 있으면 proxy1.example.com
// 프록시를 통해 접속하고 그렇지 않으면 직접 접속합니다.
if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";