دستور زبان PAC (Proxy auto-config)
اگر در این مستند خطایی وجود دارد یا پیشنهادی دارید، در انجمن Mudfish پیام بگذارید. نمونهها و توضیحات این صفحه با ترجمه یا مراجعه به وبسایتهای زیر تهیه شدهاند:
افزونهٔ مرورگر Mudfish از قالب فایل PAC (Proxy auto-config) پشتیبانی میکند.
توابع PAC
مرورگرهای پشتیبانیکنندهٔ PAC معمولاً توابع معرفیشده در قالب استاندارد تعیینشده توسط Netscape را پشتیبانی میکنند.
با این حال، این قابلیتها معمولاً در sandbox اجرا میشوند و محیط آنها بهشدت محدود است. برای مثال، بررسی اطلاعات User Agent اصولاً مسدود است.
در ادامه توابع مجاز در sandbox توضیح داده میشوند. کد نمونهها بدون تغییر حفظ شده است؛ معنی توضیحات کرهای داخل کد، پیش از هر نمونه به فارسی آمده است.
dnsDomainIs
نام میزبان را بررسی میکند و در صورت تطبیق true برمیگرداند. معمولاً برای بررسی نام میزبانهای مشخص به عنوان استثنا استفاده میشود.
اگر نام میزبان google.com یا زیردامنههای آن مانند maps.google.com و www.google.com باشد، مرورگر بدون پروکسی مستقیم متصل میشود.
// 만약 hostname 이 google.com 과 같거나 하위 주소들이 매치된다면
// (예를 들어 maps.google.com, www.google.com),
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (dnsDomainIs(host, "google.com"))
return "DIRECT";
shExpMatch
نام میزبان یا URL را با رشتهای به صورت عبارت shell مقایسه میکند و در صورت تطبیق true برمیگرداند.
نمونهٔ اول درخواستهای مربوط به نام میزبانهای پایانیافته با .local را مستقیم میفرستد. نمونهٔ دوم، اتصال به vpn.domain.com یا همهٔ پوشهها و فایلهای زیر http://abcdomain.com/folder/ را بدون پروکسی انجام میدهد.
// 모든 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 نام میزبان را بررسی میکند و اگر در زیرشبکهٔ مشخص باشد true برمیگرداند. اگر نام میزبان به عنوان آرگومان داده شود، با DNS به IP تبدیل میشود.
اگر IP نام میزبان درخواستشده پس از تبدیل DNS در محدودهٔ IP دادهشده باشد، اتصال مستقیم انجام میشود.
// 만약 요청한 hostname 의 IP 주소가 (DNS resolving 후) 인자로 넘겨진
// IP 대역에 포함되는 것이면 직접 접속합니다.
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
آدرس IP رایانهٔ فعلی را برمیگرداند.
اگر رایانه در محدودهٔ IP مشخص باشد، درخواست از پروکسی 10.10.5.1 با پورت 8080 عبور میکند.
// 만약 나의 컴퓨터가 특정 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
نام میزبان را با DNS به آدرس IP تبدیل میکند.
اگر IP میزبان درخواستشده در یکی از محدودههای مشخص باشد، اتصال مستقیم انجام میشود.
// 만약 요청한 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 برمیگرداند. برای نمونه http://intranet؛ معمولاً برای دسترسی به آدرسهای وب شبکهٔ داخلی کاربرد دارد.
اگر کاربر یک نام میزبان ساده مانند http://intranet/ یا http://webserver-name01/ درخواست کند، اتصال مستقیم انجام میشود.
// 만약 사용자가 plain hostname (예를 들면, http://intranet/ 혹은
// http://webserver-name01/) 를 요청할 경우, 직접 접속하도록 합니다.
if (isPlainHostName(host))
return "DIRECT";
localHostOrDomainIs
نام میزبان را بررسی میکند و اگر بخش نام میزبان منطبق باشد true برمیگرداند.
اگر نام میزبان درخواستشده «www» یا «www.google.com» باشد، اتصال مستقیم انجام میشود.
// 만약 요청한 hostname 이 "www" 혹은 "www.google.com" 일 경우, 직접
// 접속합니다.
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";
isResolvable
نام میزبان را به IP تبدیل میکند و در صورت موفقیت true برمیگرداند.
اگر نام دامنه درست resolve نشود، خود مرورگر ممکن است موقتاً متوقف یا منجمد شود. با احتیاط استفاده کنید.
اگر نام میزبان درخواستشده توسط DNS قابل تبدیل باشد، درخواست از پروکسی proxy1.example.com عبور میکند.
// 만약 요청한 hostname 이 DNS 서버로 부터 resolving 이 될 수 있다면,
// proxy1.example.com 프록시를 통해 요청합니다.
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";
dnsDomainLevels
نام میزبان را بررسی میکند و تعداد نقطههای (.) موجود در رشته را برمیگرداند. برای مثال، برای استثنا کردن وبسرورهای شبکهٔ داخلی کاربرد دارد.
اگر نام میزبان حداقل یک نقطه داشته باشد، اتصال از proxy1.example.com انجام میشود؛ در غیر این صورت مستقیم است.
// 만약 hostname 이 . (dot) 을 하나라도 포함하고 있으면 proxy1.example.com
// 프록시를 통해 접속하고 그렇지 않으면 직접 접속합니다.
if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
weekdayRange
برای ساخت قواعد زمانی، مثلاً استفاده از پروکسی فقط در روزهای مشخص، کاربرد دارد.
از دوشنبه تا جمعه از پروکسی proxy1.example.com استفاده میشود؛ در سایر روزها اتصال مستقیم است.
// 만약 월요일부터 금요일 사이에는 proxy1.example.com 프록시를 사용하도록
// 하고 그렇지 않을 경우는 직접 인터넷에 접속하도록 합니다.
if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
dateRange
برای ساخت قواعد زمانی، مثلاً اعمال پروکسی فقط در ماههای مشخص، کاربرد دارد.
از ژانویه تا مارس از پروکسی proxy1.example.com استفاده میشود؛ در سایر زمانها اتصال مستقیم است.
// 만약 1월부터 3월까지는 proxy1.example.com 프록시를 사용하도록 설정하고
// 그렇지 않을 경우는 직접 접속하도록 조치합니다.
if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
timeRange
برای استفاده از پروکسی فقط در بازهٔ زمانی مشخص کاربرد دارد.
فقط از ساعت 8 صبح تا 6 عصر از proxy1.example.com استفاده میشود؛ در سایر ساعتها اتصال مستقیم است.
// 오직 아침 8 시부터 오후 6 시까지만 proxy1.example.com 을 사용하도록
// 하고 그렇지 않을 경우는 직접 접속합니다.
if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
alert
این تابع در تعریف اولیهٔ قالب PAC وجود نداشت، اما برای رفع مشکل در مرورگرهای Internet Explorer و Firefox تعریف شده است.
نتیجهٔ تبدیل DNS در کنسول خطای مرورگر نمایش داده میشود.
// 브라우저의 error 콘솔창에 DNS resolving 한 결과를 출력하도록 합니다.
resolved_host = dnsResolve(host);
alert(resolved_host);