صيغة PAC (Proxy auto-config)
إذا وجدت خطأ أو كانت لديك اقتراحات، فاترك رسالة في منتدى Mudfish (https://forums.mudfish.net). أُعدت أمثلة هذه الوثيقة وشروحها بترجمة محتوى الموقعين التاليين أو الرجوع إليه:
تدعم إضافة 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 إذا كان ضمن الشبكة الفرعية المحددة. إذا مُرر اسم مضيف، يحوّله إلى IP عبر DNS.
يتصل المثال مباشرةً إذا كان IP للمضيف المطلوب، بعد حل DNS، ضمن النطاق المحدد.
// 만약 요청한 hostname 의 IP 주소가 (DNS resolving 후) 인자로 넘겨진
// IP 대역에 포함되는 것이면 직접 접속합니다.
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
يعيد عنوان 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
تُستخدم لتفعيل الوكيل في ساعات محددة فقط.
يستخدم المثال proxy1.example.com من الساعة 8 صباحًا إلى 6 مساءً فقط، ويتصل مباشرةً خارجها.
// 오직 아침 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);