תחביר PAC (Proxy auto-config)
אם מצאתם טעות במסמך או שיש לכם הצעות, השאירו הודעה בפורום Mudfish. הדוגמאות וההסברים במקור נכתבו באמצעות תרגום או הסתמכות על האתרים הבאים:
הרחבת Mudfish תומכת בפורמט קובצי PAC (Proxy auto-config).
פונקציות PAC
דפדפנים התומכים ב־PAC תומכים בדרך כלל בפונקציות שהוגדרו בפורמט התקני של Netscape.
הפונקציות פועלות בדרך כלל בתוך sandbox, בסביבה מוגבלת מאוד. למשל, אין אפשרות לבדוק את פרטי User Agent.
להלן הפונקציות המותרות בסביבה זו. קטעי הקוד נשמרו כפי שהם במקור, כולל ההערות בקוריאנית; משמעות ההערות מוסברת בעברית לפני כל דוגמה.
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, נמצאת בטווח שנמסר, החיבור ישיר.
// 만약 요청한 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
ממירה שם מארח לכתובת 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 אם שם המארח אינו מכיל נקודה. למשל, 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 בהצלחה.
אם פתרון שם המתחם אינו מצליח, הדפדפן עלול לקפוא לזמן קצר. יש להשתמש בזהירות.
בדוגמה: אם שרת 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);