كيف تستخدم أداة ترميز وفك ترميز URL
- اختر ترميز أو فك الترميز.
- اختر النمط: مكوّن (قيم الاستعلام) لقيمة استعلام واحدة أو جزء مسار واحد، أو URL كامل للإبقاء على بنية العنوان (
:و/و?و&) سليمة. - الصق نصك أو عنوان URL وانسخ النتيجة.
تُعالَج كل البيانات داخل متصفحك. كثيرًا ما تحمل عناوين URL رموزًا وبيانات شخصية في سلاسل الاستعلام، ولا يُرفع منها شيء ولا يُخزَّن.
ما هو الترميز بالنسبة المئوية (percent-encoding)؟
لا يجوز أن تحتوي عناوين URL إلا على مجموعة محدودة من أحرف ASCII. ويمثّل الترميز بالنسبة المئوية، المعرَّف في RFC 3986، أي بايت آخر بعلامة نسبة مئوية يتبعها رقمان ست عشريان. يُحوَّل النص أولًا إلى بايتات UTF-8، ثم يُكتب كل بايت يحتاج إلى هروب بالصيغة %XX:
café & crème → caf%C3%A9%20%26%20cr%C3%A8me
هنا يتكوّن الحرف é من بايتين في UTF-8 (C3 A9)، وتصبح المسافة %20 وتصبح علامة العطف (&) %26.
الأحرف المحجوزة وغير المحجوزة
| المجموعة | الأحرف | المعنى |
|---|---|---|
| غير محجوزة | A–Z a–z 0–9 - . _ ~ | لا تحتاج إلى ترميز أبدًا. |
| محجوزة: gen-delims | : / ? # [ ] @ | تفصل الأجزاء الرئيسية من عنوان URL. |
| محجوزة: sub-delims | ! $ & ' ( ) * + , ; = | تحدد البيانات داخل جزء ما، مثل & و= في سلاسل الاستعلام. |
يجب ترميز الأحرف المحجوزة عندما تظهر بوصفها بيانات لا بوصفها فواصل. فالبحث عن R&D يجب إرساله بالشكل q=R%26D؛ وإلا رأى الخادم معاملًا ثانيًا اسمه D.
encodeURIComponent مقابل encodeURI
توفّر JavaScript دالتين، واختيار الخاطئة منهما مصدر متكرر للأخطاء:
- تُرمّز
encodeURIComponent()كل شيء عداA–Z a–z 0–9 - _ . ! ~ * ' ( ). استخدمها مع القيم المنفردة: معاملات الاستعلام وأجزاء المسار وبيانات الجزء (fragment). - تترك
encodeURI()أيضًا الرموز; , / ? : @ & = + $ #دون تغيير، فيمكن تطبيقها على عنوان URL كامل دون كسر بنيته. لكنها لن تحمي قيمة تحتوي على&أو#.
encodeURI("https://example.com/a b?q=R&D")
// "https://example.com/a%20b?q=R&D" (تُركت & كما هي)
"https://example.com/search?q=" + encodeURIComponent("R&D")
// "https://example.com/search?q=R%26D"
والأفضل من ذلك أن تدع URLSearchParams أو مكتبة عناوين URL في لغتك تبني سلاسل الاستعلام نيابةً عنك.
مزالق شائعة
+ مقابل %20
تُرمّز نماذج HTML المرسلة بصيغة application/x-www-form-urlencoded المسافة بالرمز +. أما في عناوين URL وفق RFC 3986، فإن + علامة زائد حرفية والمسافة هي %20. وقد يحوّل مفكّك الترميز الذي لا يعرف الاصطلاح المستخدم C++ إلى C أو يترك + مكان المسافات. رمّز علامة الزائد الحقيقية بالشكل %2B لتكون في أمان.
Python: urllib.parse.quote("a b&c") → a%20b%26c
urllib.parse.quote_plus("a b&c") → a+b%26c
الترميز المزدوج
ترميز نص مُرمَّز أصلًا يهرّب علامات النسبة المئوية نفسها: فيصبح %20 هو %2520. يحدث هذا عادةً عندما تُرمَّز القيمة في شيفرتك ثم مرة أخرى بواسطة إطار عمل أو عميل HTTP. وإذا رأيت %25 في عنوان URL فاشتبه في ترميز مزدوج. وفك الترميز مرتين ضار بالقدر نفسه: فقد يحوّل %41 الحرفية في بيانات المستخدم إلى A.
ترميز عنوان URL كاملًا بوصفه مكوّنًا
تشغيل encodeURIComponent على عنوان URL كامل يهرّب :// وكل /، فينتج https%3A%2F%2F.... وهذا صحيح فقط عندما يكون عنوان URL نفسه قيمة معامل، مثل redirect_uri.
نصائح
- الأرقام الست عشرية في الترميزات بالنسبة المئوية لا تفرّق بين الأحرف الكبيرة والصغيرة، لكن RFC 3986 يوصي بالأحرف الكبيرة (
%2Fوليس%2f). - لا تُرمَّز أسماء النطاقات الدولية بالنسبة المئوية؛ بل تستخدم Punycode (
xn--) بدلًا من ذلك. - هل تحتاج إلى نقل بيانات ثنائية في عنوان URL؟ ترميز Base64 الآمن للعناوين أكثر إيجازًا من ترميز كل بايت بالنسبة المئوية.
- افحص كيف يتعامل الخادم مع طلبك المُرمَّز بواسطة أداة فحص ترويسات HTTP.
الأسئلة الشائعة
لماذا تكون المسافة أحيانًا + وأحيانًا %20؟
يأتي + من ترميز نماذج HTML المستخدم في سلاسل الاستعلام وأجسام طلبات POST؛ أما %20 فهو الترميز العام وفق RFC 3986 وصالح في أي موضع من عنوان URL. وعند الشك استخدم %20.
ما الأحرف التي لا تحتاج إلى ترميز أبدًا؟
المجموعة غير المحجوزة: الحروف والأرقام والواصلة والنقطة والشرطة السفلية والتلدة. وينبغي ترميز كل ما عداها عندما يكون جزءًا من قيمة.
هل ترميز URL إجراء أمني؟
لا. هو يجعل البيانات سليمة نحويًا داخل عنوان URL فحسب، وهو قابل للعكس بالكامل. ولا يخفي البيانات ولا يمنع الحقن بمفرده.
كيف أفك ترميز عنوان URL يحتوي على تسلسلات %uXXXX؟
الصيغة %uXXXX غير قياسية وتنتجها دالة JavaScript المهجورة escape(). ترفضها أدوات فك الترميز القياسية؛ ويجب تحويلها على حدة.
آخر تحديث