Cú pháp PAC (Proxy auto-config)
Nếu tài liệu có lỗi hoặc bạn có đề xuất, hãy để lại lời nhắn trên diễn đàn Mudfish (https://forums.mudfish.net). Các ví dụ và phần giải thích ở đây được dịch hoặc viết dựa trên nội dung của các trang sau.
Tiện ích trình duyệt Mudfish hỗ trợ định dạng tệp PAC (Proxy auto-config).
Các hàm PAC
Các trình duyệt hỗ trợ định dạng PAC thường hỗ trợ các hàm trong định dạng tiêu chuẩn do Netscape quy định.
Tuy nhiên, các hàm này thường chạy trong sandbox nên môi trường thực thi bị hạn chế nghiêm ngặt. Ví dụ, việc truy cập thông tin User Agent hoàn toàn bị chặn.
Dưới đây là mô tả các hàm được phép dùng trong môi trường sandbox.
dnsDomainIs
Kiểm tra hostname và trả về true nếu khớp. Thường dùng để kiểm tra các hostname riêng lẻ cần áp dụng ngoại lệ.
// 만약 hostname 이 google.com 과 같거나 하위 주소들이 매치된다면
// (예를 들어 maps.google.com, www.google.com),
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (dnsDomainIs(host, "google.com"))
return "DIRECT";
shExpMatch
So sánh hostname hoặc URL với chuỗi được chỉ định bằng biểu thức shell và trả về true nếu khớp.
// 모든 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
Hàm này kiểm tra địa chỉ IP của hostname và trả về true nếu địa chỉ nằm trong subnet được chỉ định. Nếu đối số truyền vào là hostname, hàm sẽ phân giải DNS để chuyển thành địa chỉ IP.
// 만약 요청한 hostname 의 IP 주소가 (DNS resolving 후) 인자로 넘겨진
// IP 대역에 포함되는 것이면 직접 접속합니다.
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
Trả về địa chỉ IP của máy tính hiện tại.
// 만약 나의 컴퓨터가 특정 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
Chuyển hostname thành địa chỉ IP bằng cách phân giải 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
Trả về true nếu hostname không chứa dấu . (chấm). Ví dụ như http://intranet; hàm này thường có thể dùng khi truy cập địa chỉ web trong mạng nội bộ.
// 만약 사용자가 plain hostname (예를 들면, http://intranet/ 혹은
// http://webserver-name01/) 를 요청할 경우, 직접 접속하도록 합니다.
if (isPlainHostName(host))
return "DIRECT";
localHostOrDomainIs
Kiểm tra hostname và trả về true nếu phần hostname khớp nhau.
// 만약 요청한 hostname 이 "www" 혹은 "www.google.com" 일 경우, 직접
// 접속합니다.
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";
isResolvable
Chuyển hostname thành địa chỉ IP và trả về true nếu thành công.
Nếu không phân giải được tên miền, trình duyệt có thể tạm thời bị treo (ngừng phản hồi). Hãy thận trọng khi sử dụng.
// 만약 요청한 hostname 이 DNS 서버로 부터 resolving 이 될 수 있다면,
// proxy1.example.com 프록시를 통해 요청합니다.
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";
dnsDomainLevels
Kiểm tra hostname và trả về số dấu . (chấm) trong chuỗi. Ví dụ, có thể dùng để tạo ngoại lệ cho máy chủ web trong mạng nội bộ.
// 만약 hostname 이 . (dot) 을 하나라도 포함하고 있으면 proxy1.example.com
// 프록시를 통해 접속하고 그렇지 않으면 직접 접속합니다.
if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
weekdayRange
Có thể dùng để tạo quy tắc dựa trên thời gian, chẳng hạn chỉ trả về cài đặt proxy vào những ngày cụ thể.
// 만약 월요일부터 금요일 사이에는 proxy1.example.com 프록시를 사용하도록
// 하고 그렇지 않을 경우는 직접 인터넷에 접속하도록 합니다.
if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
dateRange
Có thể dùng để tạo quy tắc dựa trên thời gian, chẳng hạn chỉ áp dụng proxy trong những tháng cụ thể.
// 만약 1월부터 3월까지는 proxy1.example.com 프록시를 사용하도록 설정하고
// 그렇지 않을 경우는 직접 접속하도록 조치합니다.
if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
timeRange
Có thể dùng khi bạn chỉ muốn sử dụng proxy trong một khoảng thời gian cụ thể.
// 오직 아침 8 시부터 오후 6 시까지만 proxy1.example.com 을 사용하도록
// 하고 그렇지 않을 경우는 직접 접속합니다.
if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
alert
Hàm này không có khi định dạng PAC được định nghĩa lần đầu, nhưng Internet Explorer và Firefox có định nghĩa hàm này để phục vụ việc khắc phục sự cố.
// 브라우저의 error 콘솔창에 DNS resolving 한 결과를 출력하도록 합니다.
resolved_host = dnsResolve(host);
alert(resolved_host);