فایلهای پیکربندی PAC (Proxy Auto-Config) برای تنظیم تنظیمات پروکسی در مرورگرها استفاده میشوند. این فایلها به صورت متنی نوشته میشوند و قوانین مشخصی را برای توجیه مرورگر در استفاده از پروکسیها تعیین میکنند. توابع JavaScript نیز در این فایلها میتوانند استفاده شوند تا تصمیمگیریهای پیچیدهتری انجام دهند.
در ادامه یک نمونه ساده از یک فایل PAC به همراه توضیح آورده شده است:
```javascript
function FindProxyForURL(url, host) {
// اگر دامنه به example.com تعلق داشته باشد، از پروکسی استفاده کن
if (shExpMatch(host, "*.example.com")) {
return "PROXY proxy.example.com:8080";
}
// در غیر اینصورت بهصورت مستقیم به اینترنت متصل شو
return "DIRECT";
}
```
در این مثال، تابع `FindProxyForURL` دو آرگومان `url` و `host` را دریافت میکند. اگر دامنه مطابق با الگوی `*.example.com` باشد (یعنی همه زیردامنههای example.com)، مرورگر از پروکسی با آدرس `proxy.example.com:8080` برای دسترسی به این دامنه استفاده میکند. در غیر این صورت، بهصورت مستقیم به اینترنت متصل میشود.
این تنظیمات PAC به عنوان یک میانجی بین مرورگر و سرورهای اینترنتی عمل میکنند و امکان تغییر دینامیک تنظیمات پروکسی را فراهم میکنند.
مسئله پیچیدهتری را در یک مثال دیگر ارائه میدهم. در این مثال، میخواهیم بر اساس نوع سایتها (http یا https) به پروکسی یا اتصال مستقیم تصمیم بگیریم.
```javascript
function FindProxyForURL(url, host) {
// اگر نوع اتصال به http باشد، از پروکسی HTTP استفاده کن
if (url.substring(0, 5) == "http:") {
return "PROXY proxy-http.example.com:8080";
}
// اگر نوع اتصال به https باشد، از پروکسی HTTPS استفاده کن
if (url.substring(0, 6) == "https:") {
return "PROXY proxy-https.example.com:8080";
}
// در غیر این صورت بهصورت مستقیم به اینترنت متصل شو
return "DIRECT";
}
```
در این مثال، تابع `FindProxyForURL` دو آرگومان `url` و `host` را دریافت میکند. ابتدا بررسی میکنیم که آیا اتصال به سایت از نوع HTTP یا HTTPS است. اگر آدرس URL با "http:" آغاز شود، مرورگر از پروکسی HTTP با آدرس `proxy-http.example.com:8080` برای دسترسی به سایتهای HTTP استفاده میکند. اگر آدرس URL با "https:" آغاز شود، مرورگر از پروکسی HTTPS با آدرس `proxy-https.example.com:8080` برای دسترسی به سایتهای HTTPS استفاده میکند. در غیر این صورت، بهصورت مستقیم به اینترنت متصل میشود.
این نمونه نشان میدهد که فایل PAC میتواند تصمیمگیریهای پیچیدهتری بر اساس ویژگیهای URL انجام دهد تا تنظیمات پروکسی مناسب را برای ارتباطات مرورگر تعیین کند.
سینتکس اصلی یک فایل PAC (Proxy Auto-Config) به صورت زیر است:
```javascript
function FindProxyForURL(url, host) {
// قوانین و شرایط برای تنظیم پروکسی در اینجا قرار میگیرند
// اگر هیچ قاعدهای مطابق نشود، بهصورت مستقیم به اینترنت متصل میشود
return "DIRECT";
}
```
در این سینتکس:
- `function FindProxyForURL(url, host)` تابع اصلی است که دو آرگومان `url` و `host` را دریافت میکند. این تابع برای تصمیمگیری در مورد استفاده از پروکسی برای دسترسی به URLها و دامنهها استفاده میشود.
- داخل تابع، شما میتوانید قوانین خود را برای تعیین تنظیمات پروکسی اعمال کنید. این میتواند شرایط مختلفی بر اساس URL یا دامنهها باشد. به عنوان مثال، شما میتوانید از توابع مانند `shExpMatch()` برای تطبیق الگوهای دلخواه استفاده کنید.
- سپس با استفاده از دستور `return`، شما تصمیم خود را در مورد استفاده از پروکسی یا اتصال مستقیم بهصورت مستقیم به اینترنت مشخص میکنید. اگر هیچ یک از شرایط مطابقت نکند، با `return "DIRECT";` بهصورت مستقیم به اینترنت متصل میشود.
به عنوان مثال، در مثالهای قبلی توضیح داده شده که چگونه از این تابع برای تنظیم پروکسی بر اساس دامنههای مختلف یا نوع اتصال (HTTP یا HTTPS) استفاده میشود. توانایی استفاده از توابع مختلف جاوااسکریپت و عبارات شرطی به شما اجازه میدهد تا تنظیمات پیشرفتهتری را تعریف کنید.
به عنوان مثال، اگر شما میخواهید بر اساس آدرس IP تصمیم بگیرید که آیا از پروکسی استفاده شود یا نه، میتوانید از توابع `isInNet()` برای تطبیق IPها استفاده کنید. در اینجا یک مثال است:
```javascript
function FindProxyForURL(url, host) {
// اگر IP سرور مقصد در محدوده 192.168.0.0 تا 192.168.255.255 باشد، از پروکسی استفاده نکن
if (isInNet(host, "192.168.0.0", "255.255.0.0")) {
return "DIRECT";
}
// در غیر این صورت، از پروکسی استفاده کن
return "PROXY proxy.example.com:8080";
}
```
در این مثال، از تابع `isInNet()` برای بررسی آیا IP مقصد در محدوده 192.168.0.0 تا 192.168.255.255 قرار دارد یا نه، استفاده شده است. اگر IP در این محدوده باشد، مرورگر بهصورت مستقیم به اینترنت متصل میشود (`return "DIRECT";`) و در غیر این صورت از پروکسی با آدرس `proxy.example.com:8080` استفاده میکند.
این نمونه نشان میدهد که فایل PAC میتواند بر اساس IP آدرس مقصد نیز تصمیمگیری کند و تنظیمات پروکسی را متناسب با آدرس IP تعیین کند.
با توجه به اینکه آدرسهای IP عمومی یک محدوده خاصی ندارند و همگی در اختیار سازندگان و مدیران سرورها و دستگاههای شبکه هستند، مثال محدوده یک آدرس IP عمومی را تا حدی سنتز کنیم:
```javascript
function FindProxyForURL(url, host) {
// اگر IP سرور مقصد در محدوده 203.0.113.0 تا 203.0.113.255 باشد، از پروکسی استفاده نکن
if (isInNet(host, "203.0.113.0", "255.255.255.0")) {
return "DIRECT";
}
// در غیر این صورت، از پروکسی استفاده کن
return "PROXY proxy.example.com:8080";
}
```
در این مثال، محدوده تصادفی 203.0.113.0 تا 203.0.113.255 به عنوان یک مثال مورد استفاده قرار گرفته است. در عمل، شما باید محدودههای مورد نظر خود را با آدرسهای IP عمومی مشخص کنید. این مثال نشان میدهد که میتوانید با استفاده از تابع `isInNet()` برای تعیین محدودههای خاص آدرسهای IP، تصمیمگیری در مورد استفاده از پروکسی انجام دهید.
برای تصمیمگیری در مورد اتصال به یک پورت خاص، میتوانید از تابع `isPlainHostName()` و تابع `shExpMatch()` به همراه شرایط مناسبی استفاده کنید. در این مثال، اگر میخواهید اتصال به پورت 80 (HTTP) از پروکسی استفاده شود و در غیر این صورت از اتصال مستقیم به اینترنت استفاده شود:
```javascript
function FindProxyForURL(url, host) {
// اگر آدرس URL به دامنههای خاصی اشاره کند، از پروکسی استفاده نکن
if (shExpMatch(host, "*.example.com") || shExpMatch(host, "*.example2.com")) {
return "DIRECT";
}
// اگر اتصال به پورت 80 (HTTP) باشد، از پروکسی استفاده کن
if (isPlainHostName(host) || dnsDomainIs(host, "localhost") || shExpMatch(host, "127.0.0.1")) {
return "PROXY proxy.example.com:80";
}
// در غیر این صورت بهصورت مستقیم به اینترنت متصل شو
return "DIRECT";
}
```
در این مثال، ابتدا بررسی میشود که آدرس URL به دامنههای خاصی (مانند example.com یا example2.com) اشاره دارد. اگر این شرط صدق کند، از پروکسی استفاده نمیشود (`return "DIRECT";`).
سپس، بررسی میشود که آیا اتصال به پورت 80 (HTTP) باشد یا نه. اگر آدرس هاست به دامنههای ساده (بدون نقطه) اشاره کند یا به localhost (127.0.0.1) متصل شود، از پروکسی با آدرس `proxy.example.com:80` استفاده میشود. در غیر این صورت، بهصورت مستقیم به اینترنت متصل میشود. این نمونه نشان میدهد که چگونه میتوانید بر اساس پورت اتصال تصمیمگیری کنید.
ترمینولوژی اسکریپت فایلهای پیکربندی PAC (Proxy Auto-Config) به زبان ساده به شرح زیر است:
1. تعریف تابع FindProxyForURL(url, host):
- تابع اصلی که برنامه PAC از آن استفاده میکند.
- ورودی: `url` آدرس کامل و `host` نام میزبان.
- خروجی: رشته حاوی تنظیمات پروکسی برای آدرس وارد شده.
2. استفاده از شرطها:
- `if`, `else if`, `else` برای اعمال شرایط مختلف.
- میتوانید از `shExpMatch()` برای مقایسه با الگوها استفاده کنید.
3. تعریف متغیرها:
- متغیرها مانند `myProxy` برای ذخیره نام پروکسیها.
- از `var` برای تعریف متغیرها استفاده کنید.
4. تنظیمات پروکسی:
- استفاده از `return "PROXY <آدرس>: <پورت>";` برای مشخص کردن تنظیمات پروکسی.
- `return "DIRECT";` برای عبور مستقیم از پروکسی.
5. لوپها:
- امکان استفاده از حلقهها مانند `for` و `while` برای ایجاد ساختارهای تکراری.
6. توابع کمکی:
- میتوانید توابع کمکی تعریف کنید و از آنها در تابع اصلی استفاده کنید.
نمونهای از یک اسکریپت PAC:
```javascript
function FindProxyForURL(url, host) {
// تنظیمات پروکسی برای آدرسهای خاص
if (shExpMatch(url, "https://internal-site/*")) {
return "PROXY internal-proxy:8080";
}
// تنظیمات پروکسی پیشفرض
return "PROXY default-proxy:8080; DIRECT";
}
```
لطفاً توجه داشته باشید که این یک نمونه ساده است و شما میتوانید آن را بر اساس نیازهای خود تغییر دهید.
این توضیحات به ترتیب اجزای کد PAC ارائه شده میپردازند:
1. تابع اصلی `FindProxyForURL(url, host)`:
- این تابع بر اساس آدرس URL و نام میزبان (host) فراخوانی میشود.
- مرحله اول از این تابع شروع میشود.
2. شرط برای آدرس خاص `if (shExpMatch(url, "https://internal-site/*"))`:
- اینجا یک شرط قرار دارد که اگر URL با الگوی "https://internal-site/*" مطابقت داشته باشد، از پروکسی با آدرس "internal-proxy:8080" استفاده میشود.
3. تنظیمات پروکسی پیشفرض `return "PROXY default-proxy:8080; DIRECT";`:
- اگر هیچ یک از شرایط قبلی مطابقت نداشته باشد، از پروکسی با آدرس "default-proxy:8080" استفاده میشود. اگر هیچ پروکسی مورد نظر نباشد، به صورت مستقیم (DIRECT) به اینترنت دسترسی پیدا میکند.
4. توجه به دستورات متداول:
- `shExpMatch()`: این تابع برای مقایسه URL با یک الگو استفاده میشود.
- `return "PROXY <آدرس>: <پورت>";`: با این دستور، آدرس و پورت پروکسی مشخص میشود.
- `return "DIRECT";`: با این دستور، عبور مستقیم از پروکسی تعیین میشود.
این توضیحات به شما کمک میکنند تا فهم بهتری از کارکرد کد PAC داشته باشید.