مرجع الوسيط
التسلسل الهرمي لأنواع الوسيط لخط أنابيب خادم Elide.
يعترض الوسيط الطلبات والاستجابات بترتيب التصريح. كل وسيط مُدرج على مستوى الخادم يلتف حول كل طلب؛ الوسيط المُدرج على مستوى المسار يلتف فقط حول الطلبات المطابقة لذلك المسار.
يُطبق الوسيط كمكدس: الوسيط الأول في القائمة يعمل في الطبقة الخارجية (يرى الطلب الخام أولاً والاستجابة النهائية أخيراً).
أنواع الوسيط المحددة تُشكل اتحاداً مُمَيزاً عبر typealias Middleware. استخدم الأصناف المفتوحة المحددة مباشرةً:
Compress — ضغط الاستجابات أثناء الإرسال
RateLimit — تحديد معدل الطلبات بنافذة منزلقة لكل مفتاح
Cors — ترويسات مشاركة الموارد عبر المصادر
Headers — إضافة أو تعيين أو إزالة ترويسات الطلب/الاستجابة العشوائية
BasicAuth — مصادقة HTTP الأساسية مع بيانات اعتماد bcrypt
RequestId — حقن معرف فريد في كل طلب
AccessLog — تسجيل مُهيكل لكل طلب مع التحكم بالتنسيق
Rewrite — إعادة كتابة مسارات الطلب قبل مطابقة المسارات
BodyLimit — رفض أجسام الطلبات التي تتجاوز حد البايتات
TailscaleAuth — مصادقة مدركة لهوية Tailscale
ErrorPage — صفحات خطأ HTML مخصصة لكل كود حالة
JwtAuth — التحقق من رموز JWT/OAuth بمفاتيح ثابتة
SecurityHeaders — حقن ترويسات أمان الاستجابة القياسية (HSTS، CSP، إلخ.)
IpFilter — تصفية السماح/الرفض بعناوين IP حسب CIDR
ConnectionLimit — تحديد الاتصالات المتزامنة لكل عنوان IP
> هذه الصفحة مُولَّدة تلقائياً من مخطط PKL. راجع الدليل لأمثلة الاستخدام.
الأنواع
HttpMethod
سلسلة طريقة HTTP، مشتركة مع Route.pkl.
typealias HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE"AccessLogFormat
تنسيق مخرجات سجل الوصول.
"combined" — تنسيق سجل Apache المُدمج (IP، المستخدم، الطريقة، المسار، الحالة، الحجم، المُحيل، وكيل المستخدم)
"common" — تنسيق سجل Apache الشائع (بدون المُحيل أو وكيل المستخدم)
"json" — كائن JSON واحد لكل سطر، قابل للتحليل آلياً
"ecs" — مخطط Elastic المشترك، لاستيعاب Elasticsearch/Kibana
typealias AccessLogFormat = "combined" | "common" | "json" | "ecs"JwtAlgorithm
معرف خوارزمية توقيع JWT.
RSA: "RS256"، "RS384"، "RS512".
ECDSA: "ES256"، "ES384"، "ES512".
HMAC (متماثل): "HS256"، "HS384"، "HS512".
EdDSA: "EdDSA" (Ed25519).
typealias JwtAlgorithm = "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "HS256" | "HS384" | "HS512" | "EdDSA"Middleware
اتحاد مُمَيز لجميع أنواع الوسيط.
استخدم أحد أصناف الوسيط المحددة المُدرجة أعلاه. يمكن دمج مثيلات وسيط متعددة في Listing على كتلة خادم أو مسار.
typealias Middleware = Compress | RateLimit | Cors | Headers | BasicAuth | RequestId | AccessLog | Rewrite | BodyLimit | TailscaleAuth | ErrorPage | JwtAuth | SecurityHeaders | IpFilter | ConnectionLimit---
Compress
صنف مفتوح — يمكن توسيعه.
ضغط الاستجابات أثناء الإرسال.
يضغط أجسام الاستجابات باستخدام تفاوض المحتوى: يختار الخادم أفضل خوارزمية من algorithms يدعمها العميل (عبر ترويسة Accept-Encoding للطلب). الاستجابات الأصغر من minSize بايت تُرسل بدون ضغط لتجنب التكلفة على الحمولات الصغيرة.
مثال
new Compress {
algorithms { "br"; "gzip" }
minSize = 512
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "compression" (ثابت) | (ثابت) |
algorithms | Listing | new { "zstd"; "br"; "gzip" } | خوارزميات الضغط المُقدمة للعملاء، بترتيب أفضلية الخادم. |
minSize | UInt | 1024 | الحد الأدنى لحجم جسم الاستجابة (بالبايت) المطلوب لتفعيل الضغط. |
contentTypes | Listing | null | أنماط Content-Type المؤهلة للضغط. |
algorithms
خوارزميات الضغط المُقدمة للعملاء، بترتيب أفضلية الخادم.
أول خوارزمية يدعمها العميل أيضاً تفوز. الافتراضي هو zstd ثم Brotli ثم gzip.
minSize
الحد الأدنى لحجم جسم الاستجابة (بالبايت) المطلوب لتفعيل الضغط.
الاستجابات ذات الجسم الأصغر من هذا الحد تُرسل بدون ضغط. الافتراضي: 1024 بايت.
contentTypes
أنماط Content-Type المؤهلة للضغط.
أنماط النمط الشامل مدعومة (مثل "text/"). عند null، تُستخدم القائمة الافتراضية المُدمجة: text/، application/json، application/xml، application/javascript، وما شابه.
---
RateLimit
صنف مفتوح — يمكن توسيعه.
تحديد معدل الطلبات بنافذة منزلقة لكل مفتاح.
يتتبع عدد الطلبات ضمن نافذة زمنية منزلقة، مفهرساً بهوية العميل (عنوان IP افتراضياً). عندما يتجاوز عميل الحد، يستجيب الخادم بـ429 Too Many Requests وترويسة Retry-After تشير إلى وقت استعادة السعة.
مثال
new RateLimit {
requests = 100
window = 60.s
key = "ip"
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "rateLimit" (ثابت) | (ثابت) |
requests | UInt(isPositive) | (مطلوب) | الحد الأقصى لعدد الطلبات المسموح بها ضمن window. يجب أن يكون موجباً. |
window | Duration | 1.s | مدة النافذة المنزلقة التي تُحسب خلالها requests. |
burst | UInt? | null | بدل الاندفاع فوق requests قبل بدء التقييد. |
key | String | "ip" | دالة المفتاح التي تحدد كيفية تجميع الطلبات للتحديد. |
statusCode | UInt | 429 | كود حالة HTTP المُرجع عند تجاوز حد المعدل. |
window
مدة النافذة المنزلقة التي تُحسب خلالها requests.
الافتراضي: ثانية واحدة.
burst
بدل الاندفاع فوق requests قبل بدء التقييد.
عند تعيينه، يُسمح بهذا العدد من الطلبات الإضافية في اندفاع قبل تفعيل تحديد المعدل. عند null (الافتراضي)، لا يُسمح باندفاع إضافي فوق requests.
key
دالة المفتاح التي تحدد كيفية تجميع الطلبات للتحديد.
القيم المدعومة:
"ip" — عنوان IP للعميل (الافتراضي)
"header: — قيمة ترويسة طلب مُسماة
"query: — قيمة معامل استعلام
"cookie: — قيمة ملف تعريف ارتباط مُسمى
الطلبات التي تتشارك نفس قيمة المفتاح تتشارك دلو تحديد معدل واحد.
statusCode
كود حالة HTTP المُرجع عند تجاوز حد المعدل.
الافتراضي: 429 (Too Many Requests).
---
Cors
صنف مفتوح — يمكن توسيعه.
ترويسات مشاركة الموارد عبر المصادر (CORS).
يتحكم في المصادر والطرق والترويسات المسموح بها في الطلبات عبر المصادر واستجابات الاستعلام المسبق (OPTIONS). يُصدر الخادم ترويسات استجابة Access-Control-* بناءً على هذه الإعدادات.
مثال
new Cors {
allowedOrigins { "https:<<>>
allowedMethods { " GET"; "POST" }
credentials = true
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "cors" (ثابت) | (ثابت) |
allowedOrigins | Listing | (فارغ) | المصادر المسموح لها بإجراء طلبات عبر المصادر. |
allowedMethods | Listing | null | طرق HTTP المسموح بها للطلبات عبر المصادر. |
allowedHeaders | Listing | null | ترويسات الطلب المسموح للعملاء بإرسالها في الطلبات عبر المصادر. |
exposeHeaders | Listing | null | ترويسات الاستجابة المسموح للمتصفح بكشفها لـJS من جانب العميل. |
maxAge | Duration | 86400.s | مدة تخزين المتصفح المؤقت لاستجابة الاستعلام المسبق. |
credentials | Boolean | false | ما إذا كانت الطلبات عبر المصادر قد تتضمن بيانات الاعتماد (ملفات |
allowedOrigins
المصادر المسموح لها بإجراء طلبات عبر المصادر.
استخدم "" للسماح بجميع المصادر. ملاحظة: "" لا يمكن دمجها مع credentials = true (المتصفحات ترفض هذا الدمج). قائمة فارغة ترفض جميع الطلبات عبر المصادر.
allowedMethods
طرق HTTP المسموح بها للطلبات عبر المصادر.
عند null، يعكس الخادم الطريقة من ترويسة Access-Control-Request-Method للاستعلام المسبق.
allowedHeaders
ترويسات الطلب المسموح للعملاء بإرسالها في الطلبات عبر المصادر.
عند null، جميع الترويسات مسموح بها (تُعكس من Access-Control-Request-Headers).
exposeHeaders
ترويسات الاستجابة المسموح للمتصفح بكشفها لـJS من جانب العميل.
الترويسات غير المُدرجة هنا تكون مخفية عن استجابات fetch(). عند null، لا تُكشف ترويسات إضافية فوق مجموعة CORS الآمنة.
maxAge
مدة تخزين المتصفح المؤقت لاستجابة الاستعلام المسبق.
قيم أعلى تُقلل عدد طلبات OPTIONS للاستعلام المسبق على حساب نشر أبطأ لتغييرات سياسة CORS. الافتراضي: 24 ساعة.
credentials
ما إذا كانت الطلبات عبر المصادر قد تتضمن بيانات الاعتماد (ملفات تعريف الارتباط، شهادات عميل TLS، ترويسات Authorization).
عند true، يجب أن يُدرج allowedOrigins مصادر صريحة (وليس "*").
---
Headers
صنف مفتوح — يمكن توسيعه.
إضافة أو تعيين أو إزالة ترويسات الطلب والاستجابة العشوائية.
تُطبق التعديلات بهذا الترتيب لكل اتجاه (طلب أو استجابة):
1. remove — حذف الترويسة إن وُجدت
2. set — الكتابة فوق الترويسة بقيمة واحدة
3. add — إلحاق قيمة إضافية (ترويسة متعددة القيم)
مثال
new Headers {
responseSet { ["X-Served-By"] = "elide" }
requestRemove { "X-Forwarded-For" }
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "headers" (ثابت) | (ثابت) |
requestSet | Mapping | (فارغ) | ترويسات تُعيَّن على الطلب قبل أن يراها المعالج. |
requestAdd | Mapping | (فارغ) | ترويسات تُلحق بالطلب قبل أن يراها المعالج. |
requestRemove | Listing | (فارغ) | أسماء ترويسات الطلب المراد إزالتها قبل أن يرى المعالج الطلب. |
responseSet | Mapping | (فارغ) | ترويسات تُعيَّن على الاستجابة بعد إنتاجها من المعالج. |
responseAdd | Mapping | (فارغ) | ترويسات تُلحق بالاستجابة بعد إنتاجها من المعالج. |
responseRemove | Listing | (فارغ) | أسماء ترويسات الاستجابة المراد إزالتها من الاستجابة. |
requestSet
ترويسات تُعيَّن على الطلب قبل أن يراها المعالج.
إذا كانت الترويسة موجودة مسبقاً، تُكتب قيمتها فوقها.
requestAdd
ترويسات تُلحق بالطلب قبل أن يراها المعالج.
إذا كانت الترويسة موجودة مسبقاً، تُضاف القيمة الجديدة بجانبها.
responseSet
ترويسات تُعيَّن على الاستجابة بعد إنتاجها من المعالج.
إذا كانت الترويسة موجودة مسبقاً، تُكتب قيمتها فوقها.
responseAdd
ترويسات تُلحق بالاستجابة بعد إنتاجها من المعالج.
إذا كانت الترويسة موجودة مسبقاً، تُضاف القيمة الجديدة بجانبها.
---
BasicAuth
صنف مفتوح — يمكن توسيعه.
مصادقة HTTP الأساسية.
يتحقق من بيانات الاعتماد من ترويسة Authorization: Basic مقابل قائمة مستخدمين ثابتة بكلمات مرور مُجزأة بـbcrypt. يُرجع 401 Unauthorized مع تحدي WWW-Authenticate عندما تكون بيانات الاعتماد مفقودة أو غير صالحة.
مثال
new BasicAuth {
realm = "Admin"
users { ["admin"] = "$2b$10$..." }
exclude { "/healthz" }
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "basicAuth" (ثابت) | (ثابت) |
realm | String | "Elide" | سلسلة النطاق المعروضة في مطالبة بيانات الاعتماد للمتصفح. |
users | Mapping | (مطلوب) | المستخدمون المسموح لهم كأزواج username إلى bcrypt-hash. |
exclude | Listing | (فارغ) | بادئات المسارات المُستبعدة من المصادقة. |
realm
سلسلة النطاق المعروضة في مطالبة بيانات الاعتماد للمتصفح.
الافتراضي: "Elide".
users
المستخدمون المسموح لهم كأزواج username إلى bcrypt-hash.
إدخال واحد على الأقل مطلوب. أنشئ التجزئات باستخدام elide auth hash أو أي أداة bcrypt قياسية. يُوصى بعامل تكلفة 10 أو أعلى.
exclude
بادئات المسارات المُستبعدة من المصادقة.
الطلبات التي يبدأ مسارها بأي بادئة مُدرجة تتجاوز المصادقة الأساسية بالكامل. مفيدة لنقاط نهاية فحص الصحة أو الجاهزية.
---
RequestId
صنف مفتوح — يمكن توسيعه.
حقن معرف طلب فريد في كل طلب.
يُولد UUID v4 ويضعه في ترويسة طلب قابلة للإعداد. يُمرر المعرف إلى المعالجات العلوية ويُضمن تلقائياً في سجلات AccessLog، مما يُتيح تتبع الطلبات من طرف إلى طرف.
| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "requestId" (ثابت) | (ثابت) |
header | String | "X-Request-Id" | اسم الترويسة المُستخدمة لحمل معرف الطلب. |
trustIncoming | Boolean | false | عند true، يُحتفظ بقيمة موجودة في header بدلاً من |
header
اسم الترويسة المُستخدمة لحمل معرف الطلب.
الافتراضي: "X-Request-Id". تُنسخ نفس الترويسة إلى الاستجابة.
trustIncoming
عند true، يُحتفظ بقيمة موجودة في header بدلاً من توليد واحدة جديدة.
فعّل هذا عندما يحقن موازن حمل أو بوابة API علوية معرفات الطلبات مسبقاً وتريد نشرها بدون تغيير.
---
AccessLog
صنف مفتوح — يمكن توسيعه.
تسجيل وصول مُهيكل لكل طلب.
يُصدر سجل واحد لكل طلب بعد إرسال الاستجابة. عند استخدامه على مستوى الخادم، يُسجل كل طلب. عند ربطه بمسار، تُسجل فقط الطلبات المطابقة. يمكن لهذا الوسيط التعايش مع LoggingSettings.accessLog للتجاوزات المحددة بالمسار أو التنسيق.
AccessLogFormat لتنسيقات المخرجات المتاحة.
| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "accessLog" (ثابت) | (ثابت) |
format | AccessLogFormat | "json" | تنسيق مخرجات السجل. |
output | String | "stdout" | وجهة مخرجات السجل. |
includeHeaders | Listing | (فارغ) | أسماء ترويسات الطلب التي تُضمن قيمها في كل سجل. |
minStatus | UInt | 0 | الحد الأدنى لكود حالة استجابة HTTP للتسجيل. |
condition | String? | null | تعبير تصفية تسجيل مشروط. |
format
تنسيق مخرجات السجل.
الافتراضي: "json" (كائن JSON واحد لكل سطر). راجع AccessLogFormat لجميع الخيارات.
output
وجهة مخرجات السجل.
يقبل "stdout" أو "stderr" أو مسار ملف مطلق. عند استخدام مسار ملف، يُنشأ الملف إذا لم يكن موجوداً ويُلحق به خلاف ذلك.
includeHeaders
أسماء ترويسات الطلب التي تُضمن قيمها في كل سجل.
مفيدة لالتقاط معرفات الارتباط وتلميحات العميل أو الترويسات الخاصة بالتطبيق. راجع RequestId لحقن المعرفات تلقائياً.
minStatus
الحد الأدنى لكود حالة استجابة HTTP للتسجيل.
الاستجابات ذات الحالة أقل من هذه القيمة تُسقط بصمت. الافتراضي: 0 (تسجيل كل شيء). عيّنه إلى 400 لتسجيل الأخطاء فقط.
condition
تعبير تصفية تسجيل مشروط.
عند تعيينه، فقط الطلبات المطابقة للشرط تُنتج سجلاً. عند null (الافتراضي)، تُسجل جميع الطلبات (بشرط minStatus). التنسيقات المدعومة:
"status:4xx" — تسجيل استجابات 4xx فقط
"status:4xx-5xx" — تسجيل استجابات 4xx و5xx
"status:500" — تسجيل الحالة 500 فقط
"status:400-599" — تسجيل الحالة 400 إلى 599
"path:/api/*" — تسجيل الطلبات التي يبدأ مسارها بـ/api/
"path_regex:^/api/.*" — تسجيل الطلبات المطابقة لتعبير نظامي
---
Rewrite
صنف مفتوح — يمكن توسيعه.
إعادة كتابة مسار الطلب قبل مطابقة المسارات.
يُطبق استبدال تعبير نظامي على مسار URI للطلب (واختيارياً سلسلة الاستعلام). تُنفذ إعادة الكتابة قبل مطابقة المسارات، لذا ترى المسارات والمعالجات اللاحقة المسار المُعاد كتابته.
مثال
new Rewrite {
from = "^/v1/(.*)"
to = "/api/$1"
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "rewrite" (ثابت) | (ثابت) |
from | String(!isEmpty) | (مطلوب) | تعبير نظامي يُطابق مقابل مسار URI للطلب. |
to | String(!isEmpty) | (مطلوب) | نمط الاستبدال المُعوض عن الجزء المطابق من المسار. |
replaceAll | Boolean | false | عند true، استبدال جميع تكرارات النمط في المسار. |
from
تعبير نظامي يُطابق مقابل مسار URI للطلب.
يمكن الإشارة إلى المجموعات الملتقطة في to باستخدام $1، $2، إلخ. يجب ألا يكون فارغاً.
to
نمط الاستبدال المُعوض عن الجزء المطابق من المسار.
يدعم مراجع المجموعات الملتقطة ($1، $2، ...). يجب ألا يكون فارغاً.
replaceAll
عند true، استبدال جميع تكرارات النمط في المسار.
عند false (الافتراضي)، يُستبدل أول تطابق فقط.
---
BodyLimit
صنف مفتوح — يمكن توسيعه.
رفض أجسام الطلبات التي تتجاوز حد حجم قابل للإعداد.
يُرجع 413 Content Too Large عندما تتجاوز ترويسة Content-Length قيمة maxBytes، أو عندما ينمو جسم مُجزأ/متدفق فوق الحد أثناء النقل. يُغلق الاتصال فوراً عند الرفض.
مثال
new BodyLimit { maxBytes = 10_000_000 } // 10 MB| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "bodyLimit" (ثابت) | (ثابت) |
maxBytes | UInt(isPositive) | (مطلوب) | الحد الأقصى لحجم جسم الطلب المسموح به بالبايت. يجب أن يكون موجباً. |
---
TailscaleAuth
صنف مفتوح — يمكن توسيعه.
مصادقة الطلبات المدركة لهوية Tailscale.
تحل هوية Tailscale لكل طلب وارد عبر واجهة whois المحلية لـtailscaled وتُقيّم اختيارياً سياسات الوصول لكل مسار. يتطلب أن يكون --tailscale نشطاً أثناء التشغيل.
ترتيب التقييم: تُفحص قواعد الرفض قبل قواعد السماح. إذا طابق طلب قاعدة رفض، يُرفض بغض النظر عن قواعد السماح.
عند injectHeaders بقيمة true، تُضاف الترويسات التالية لكل طلب مُصادق:
`Tailscale-User-Login`, `Tailscale-User-Name`,
`Tailscale-Node-Name`, `Tailscale-Node-Tags`| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "tailscaleAuth" (ثابت) | (ثابت) |
injectHeaders | Boolean | true | حقن ترويسات هوية Tailscale في كل طلب مُصادق. |
allowAll | Boolean? | null | السماح لجميع أعضاء الشبكة الخاصة بدون فحوصات إضافية. |
allowUsers | Listing | null | أسماء تسجيل دخول Tailscale (عناوين البريد الإلكتروني) المسموح لها بالوصول. |
denyUsers | Listing | null | أسماء تسجيل دخول Tailscale المرفوض وصولها. |
allowTags | Listing | null | علامات ACL لـTailscale المسموح لعُقدها بالوصول. |
denyTags | Listing | null | علامات ACL لـTailscale المرفوض وصول عُقدها. |
injectHeaders
حقن ترويسات هوية Tailscale في كل طلب مُصادق.
الافتراضي: true.
allowAll
السماح لجميع أعضاء الشبكة الخاصة بدون فحوصات إضافية.
عند true، يتجاوز allowUsers وallowTags (جميع أعضاء الشبكة مسموح لهم). تُحقن ترويسات الهوية عند injectHeaders بقيمة true. عند null، تُطبق قوائم السماح/الرفض.
allowUsers
أسماء تسجيل دخول Tailscale (عناوين البريد الإلكتروني) المسموح لها بالوصول.
عند null، لا تُطبق تصفية حسب المستخدم.
denyUsers
أسماء تسجيل دخول Tailscale المرفوض وصولها.
تُقيَّم قواعد الرفض قبل قواعد السماح.
allowTags
علامات ACL لـTailscale المسموح لعُقدها بالوصول.
على سبيل المثال، "tag:web" أو "tag:prod". عند null، لا تُطبق تصفية حسب العلامة.
denyTags
علامات ACL لـTailscale المرفوض وصول عُقدها.
تُقيَّم قواعد الرفض قبل قواعد السماح.
---
ErrorPage
صنف مفتوح — يمكن توسيعه.
صفحة خطأ HTML مخصصة لكود حالة HTTP محدد.
تستبدل جسم استجابة الخطأ الافتراضي بقالب HTML يوفره المستخدم. تُستبدل متغيرات القالب لكل طلب:
{{status}} — كود حالة HTTP الرقمي (مثل 404)
{{message}} — عبارة سبب HTTP (مثل Not Found)
{{path}} — مسار URI للطلب
تُحمل القوالب عند بدء التشغيل وتُخزن في الذاكرة. أضف ErrorPage واحد لكل كود حالة تريد تخصيصه.
مثال
new ErrorPage {
status = 404
template = "./errors/404.html"
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "errorPage" (ثابت) | (ثابت) |
status | UInt(this >= 400 && this < 600) | (مطلوب) | كود حالة HTTP الذي تُطبق عليه صفحة الخطأ هذه. |
template | String(!isEmpty) | (مطلوب) | مسار ملف أو قالب HTML مُضمن لصفحة الخطأ. |
status
كود حالة HTTP الذي تُطبق عليه صفحة الخطأ هذه.
يجب أن يكون في النطاق 400-599 (خطأ عميل أو خادم).
template
مسار ملف أو قالب HTML مُضمن لصفحة الخطأ.
عندما تبدو القيمة كمسار ملف (تحتوي على / أو \)، يُحمل الملف عند بدء التشغيل. خلاف ذلك، تُعامل كـHTML مُضمن. يدعم عناصر النائبة {{status}} و{{message}} و{{path}}.
---
JwtKey
صنف مفتوح — يمكن توسيعه.
مفتاح عام ثابت يُستخدم للتحقق من توقيع JWT.
راجع JwtAuth لكيفية مطابقة المفاتيح مع الرموز الواردة.
| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
kid | String? | null | معرف المفتاح (kid) لاختيار المفتاح. |
alg | JwtAlgorithm | (مطلوب) | خوارزمية التوقيع المُستخدمة مع هذا المفتاح. |
pem | String(!isEmpty) | (مطلوب) | مفتاح عام بترميز PEM بتنسيق SPKI أو PKCS#8. |
kid
معرف المفتاح (kid) لاختيار المفتاح.
عند تعيينه، فقط الرموز التي تطابق ترويسة JOSE kid الخاصة بها هذه القيمة ستُتحقق بهذا المفتاح. عند null، يُجرب المفتاح لجميع الرموز التي تطابق alg.
pem
مفتاح عام بترميز PEM بتنسيق SPKI أو PKCS#8.
لخوارزميات HMAC (HS256/HS384/HS512)، هذا هو السر المشترك المُرمز بـbase64.
---
JwtAuth
صنف مفتوح — يمكن توسيعه.
مصادقة رموز JWT/OAuth.
يتحقق من رموز JSON Web Tokens (JWT) باستخدام مفاتيح عامة ثابتة مع التحقق من التوقيع بمكتبة ring. يدعم RSA (RS256/RS384/RS512)، وECDSA (ES256/ES384/ES512)، وHMAC (HS256/HS384/HS512)، وEdDSA.
يمكن استخراج الرموز من مصادر متعددة (تُفحص بالترتيب):
"bearer" — ترويسة Authorization: Bearer
"cookie: — قيمة ملف تعريف ارتباط مُسمى
"query: — قيمة معامل استعلام
"header: — قيمة ترويسة مخصصة
يُرجع 401 Unauthorized عند عدم العثور على رمز صالح.
مثال
new JwtAuth {
keys { new JwtKey { alg = "RS256"; pem = read("./public.pem") } }
audiences { "https:<<>>
exclude { " /healthz" }
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "jwtAuth" (ثابت) | (ثابت) |
keys | Listing | (مطلوب) | مفاتيح عامة ثابتة للتحقق من التوقيع. |
algorithms | Listing | new { "RS256" } | الخوارزميات المقبولة للتحقق من الرموز. |
issuers | Listing | (فارغ) | مُصدرو الرموز المسموح بهم (مطالبة iss). |
audiences | Listing | (فارغ) | جمهور الرموز المسموح به (مطالبة aud). |
clockSkewSecs | UInt | 30 | تسامح انحراف الساعة (بالثواني) لفحوصات مطالبتي exp وnbf. |
tokenSources | Listing | (فارغ) | قائمة مرتبة بمواقع استخراج JWT منها. |
exclude | Listing | (فارغ) | بادئات المسارات المُستبعدة من مصادقة JWT. |
injectClaimsHeaders | Boolean | false | عند true، حقن مطالبات JWT المُتحقق منها كترويسات طلب. |
claimsHeaderPrefix | String | "X-Jwt-Claim-" | البادئة المُلحقة بأسماء المطالبات عند حقن ترويسات المطالبات. |
keys
مفاتيح عامة ثابتة للتحقق من التوقيع.
يجب توفير مفتاح واحد على الأقل. راجع JwtKey لتنسيق المفتاح. عند وجود ترويسة kid في الرمز، تُجرب فقط المفاتيح ذات kid المطابق؛ وإلا تُجرب جميع المفاتيح ذات alg المطابق.
algorithms
الخوارزميات المقبولة للتحقق من الرموز.
تُرفض الرموز الموقعة بخوارزمية ليست في هذه القائمة حتى لو وُجد مفتاح مطابق. هذا يمنع هجمات إرباك الخوارزميات. الافتراضي: ["RS256"].
issuers
مُصدرو الرموز المسموح بهم (مطالبة iss).
عند عدم كونها فارغة، تُرفض الرموز التي لا تطابق مطالبة iss الخاصة بها أي إدخال. عند الفراغ (الافتراضي)، يُقبل أي مُصدر.
audiences
جمهور الرموز المسموح به (مطالبة aud).
عند عدم كونها فارغة، تُرفض الرموز التي لا تتضمن مطالبة aud الخاصة بها قيمة واحدة مُدرجة على الأقل. عند الفراغ (الافتراضي)، يُقبل أي جمهور.
clockSkewSecs
تسامح انحراف الساعة (بالثواني) لفحوصات مطالبتي exp وnbf.
يعوض عن انحراف الساعة بين مُصدر الرمز وهذا الخادم. الافتراضي: 30 ثانية.
tokenSources
قائمة مرتبة بمواقع استخراج JWT منها.
أول مصدر يُنتج رمزاً يفوز. القيم المدعومة:
"bearer" — ترويسة Authorization: Bearer
"cookie: — ملف تعريف ارتباط مُسمى
"query: — معامل استعلام
"header: — ترويسة طلب مخصصة
عند الفراغ (الافتراضي)، يُستخدم "bearer" أثناء التشغيل.
exclude
بادئات المسارات المُستبعدة من مصادقة JWT.
الطلبات التي يبدأ مسارها بأي بادئة مُدرجة تتجاوز التحقق من الرمز. مفيدة لفحوصات الصحة ونقاط النهاية العامة.
injectClaimsHeaders
عند true، حقن مطالبات JWT المُتحقق منها كترويسات طلب.
كل مطالبة تصبح ترويسة بالاسم — على سبيل المثال، مطالبة sub تصبح X-Jwt-Claim-Sub.
claimsHeaderPrefix
البادئة المُلحقة بأسماء المطالبات عند حقن ترويسات المطالبات.
الافتراضي: "X-Jwt-Claim-".
---
IpFilter
صنف مفتوح — يمكن توسيعه.
تصفية السماح/الرفض بعناوين IP حسب CIDR.
يتحكم في الوصول بناءً على عنوان IP للعميل. عند تحديد كل من allow وdeny، الرفض له الأولوية (عنوان IP مرفوض يُرفض حتى لو طابق إدخال سماح أيضاً). الطلبات المرفوضة تتلقى 403 Forbidden.
عند فراغ كلتا القائمتين، هذا الوسيط لا يفعل شيئاً.
مثال
new IpFilter {
allow { "10.0.0.0/8"; "172.16.0.0/12" }
deny { "10.0.0.1/32" }
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "ipFilter" (ثابت) | (ثابت) |
allow | Listing | (فارغ) | نطاقات CIDR المسموح بها. |
deny | Listing | (فارغ) | نطاقات CIDR المرفوضة. |
allow
نطاقات CIDR المسموح بها.
عند عدم كونها فارغة، فقط عناوين IP للعملاء المطابقة لإدخال واحد على الأقل مسموح بها. يدعم كلاً من تدوين IPv4 وIPv6 (مثل "10.0.0.0/8"، "::1/128").
deny
نطاقات CIDR المرفوضة.
الرفض له الأولوية على السماح. يدعم كلاً من تدوين IPv4 وIPv6.
---
SecurityHeaders
صنف مفتوح — يمكن توسيعه.
ترويسات أمان الاستجابة القياسية (HSTS، X-Frame-Options، CSP، إلخ.).
يحقن ترويسات أمان في كل استجابة. كل حقل يُقابل ترويسة واحدة. عندما يكون الحقل null، تُستخدم القيمة الافتراضية المُدمجة. عيّن الحقل إلى "" (سلسلة فارغة) لإخفاء تلك الترويسة بالكامل.
مثال
new SecurityHeaders {
hsts = "max-age=63072000; includeSubDomains; preload"
contentSecurityPolicy = "default-src 'self'"
}| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "securityHeaders" (ثابت) | (ثابت) |
hsts | String? | null | قيمة ترويسة Strict-Transport-Security. |
xContentTypeOptions | String? | null | قيمة ترويسة X-Content-Type-Options. |
xFrameOptions | String? | null | قيمة ترويسة X-Frame-Options. |
xXssProtection | String? | null | قيمة ترويسة X-XSS-Protection. |
referrerPolicy | String? | null | قيمة ترويسة Referrer-Policy. |
contentSecurityPolicy | String? | null | قيمة ترويسة Content-Security-Policy. |
hsts
قيمة ترويسة Strict-Transport-Security.
يتحكم في فرض HTTPS في المتصفحات. عند null، تُستخدم القيمة الافتراضية المُدمجة. مثال: "max-age=31536000; includeSubDomains".
xContentTypeOptions
قيمة ترويسة X-Content-Type-Options.
يمنع استنشاق نوع MIME. القيمة الافتراضية المُدمجة: "nosniff".
xFrameOptions
قيمة ترويسة X-Frame-Options.
يتحكم فيما إذا كان يمكن تضمين الصفحة في . القيم النموذجية: "DENY" أو "SAMEORIGIN".
xXssProtection
قيمة ترويسة X-XSS-Protection.
تلميح تصفية XSS القديم للمتصفحات الأقدم. المتصفحات الحديثة تتجاهل هذا لصالح CSP.
referrerPolicy
قيمة ترويسة Referrer-Policy.
يتحكم في كمية معلومات المُحيل المُرسلة مع الطلبات. القيم الشائعة: "no-referrer"، "strict-origin-when-cross-origin".
contentSecurityPolicy
قيمة ترويسة Content-Security-Policy.
يتحكم في الموارد التي يُسمح للمتصفح بتحميلها. هذه هي أكثر ترويسات الأمان تأثيراً لتطبيقات الويب.
---
ConnectionLimit
صنف مفتوح — يمكن توسيعه.
تحديد الاتصالات المتزامنة لكل عنوان IP.
يتتبع عدد الاتصالات المفتوحة لكل عنوان IP للعميل. عندما يتجاوز عميل maxPerIp اتصال متزامن، تُرفض محاولات الاتصال الإضافية بالاستجابة 503 Service Unavailable.
RateLimit.
| الحقل | النوع | الافتراضي | الوصف |
|---|---|---|---|
type | String | "connectionLimit" (ثابت) | (ثابت) |
maxPerIp | UInt(isPositive) | (مطلوب) | الحد الأقصى لعدد الاتصالات المتزامنة المسموح بها من عنوان IP |
maxPerIp
الحد الأقصى لعدد الاتصالات المتزامنة المسموح بها من عنوان IP واحد. يجب أن يكون موجباً.
---