سؤال

هل يُسمح بالأقواس المربعة في عناوين URL؟

لاحظت ذلك أباتشي المشاعات HttpClient (3.0.1) يطرح IOException، لكن wget وFirefox يقبلان الأقواس المربعة.

مثال لعنوان URL:

http://example.com/path/to/file[3].html

يواجه عميل HTTP الخاص بي عناوين URL هذه ولكنني لست متأكدًا مما إذا كان يجب تصحيح التعليمات البرمجية أو طرح استثناء (كما ينبغي أن يكون بالفعل).

هل كانت مفيدة؟

المحلول

آر إف سي 3986 تنص على

يتم تمييز مضيف تم تحديده بواسطة عنوان حرفي لبروتوكول الإنترنت ، الإصدار 6 [RFC3513] أو لاحقًا ، من خلال إرفاق IP الحرفي داخل قوسين مربع ([" و "]).هذا هو المكان الوحيد الذي يُسمح فيه لأحرف القوس المربعة في بناء جملة URI.

لذلك لا ينبغي أن ترى مثل هذه URIs في البرية من الناحية النظرية، حيث يجب أن تصل مشفرة.

نصائح أخرى

أعلم أن هذا السؤال قديم بعض الشيء، لكني أردت فقط أن أشير إلى أن PHP يستخدم الأقواس لتمرير المصفوفات في عنوان URL.

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

في هذه الحالة $_GET['bar'] سوف يحتوي array(1, 2, 3).

أي متصفح أو برنامج يدعم الويب ويقبل عناوين URL ولا يطرح استثناءً عند تقديم أحرف خاصة يكاد يكون مضمونًا أنه يقوم بتشفير الأحرف الخاصة خلف الكواليس.الأقواس المتعرجة والأقواس المربعة والمسافات وما إلى ذلك جميعها لها طرق مشفرة خاصة لتمثيلها حتى لا تنتج تعارضات.وفقًا للإجابات السابقة، فإن الطريقة الأكثر أمانًا للتعامل معها هي تشفير عنوان URL لها قبل تسليمها إلى شيء سيحاول حل عنوان URL.

إلى حد كبير الأحرف الوحيدة غير المسموح بها في أسماء المسارات هي # و؟لأنها تشير إلى نهاية المسار.

سيكون لـ uri RFC إجابة نهائية:

http://www.ietf.org/rfc/rfc1738.txt

غير آمنة:

يمكن أن تكون الشخصيات غير آمنة لعدد من الأسباب.المساحة الشخصية غير آمنة لأن المساحات الكبيرة قد تختفي و قد يتم إدخال مسافات غير مهمة عند نسخ عناوين URL أو تنضيد أو تخضع لعلاج برامج معالجة النصوص.الأحرف "<" و ">" غير آمنة لأنها تستخدم ك محددات حول عناوين URL في النص الحر ؛يتم استخدام علامة الاقتباس ("") ل تحديد عناوين URL في بعض الأنظمة.الحرف "#" غير آمن ويجب يتم ترميزها دائما لأنه يستخدم في شبكة الويب العالمية وغيرها أنظمة لتحديد عنوان URL من معرف جزء / مرساة قد اتبعها.الحرف "٪" غير آمن لأنه يستخدم ل ترميزات الأحرف الأخرى.الشخصيات الأخرى غير آمنة لأن من المعروف أن البوابات ووكلاء النقل الآخرين يقومون بالتعديل في بعض الأحيان هذه الشخصيات.هذه الأحرف هي "{" ، "}" ، "|" ، "\" ، "^" ، "~" ، "[" و "]" و "'".

يجب دائمًا ترميز كافة الأحرف غير الآمنة ضمن عنوان URL.من أجل على سبيل المثال ، يجب ترميز الحرف "#" داخل عناوين URL حتى في الأنظمة التي لا تتعامل عادة مع الجزء أو المرساة المعرفات ، بحيث إذا تم نسخ عنوان URL إلى نظام آخر لا تستخدمها ، لن يكون من الضروري تغيير ترميز URL.

الجواب هو أنهم يجب تكون مشفرة سداسي عشرية، ولكن بمعرفة قانون بوستيل، فإن معظم الأشياء ستقبلها حرفيًا.

لاستخدام فئة HttpClient commons، ستحتاج إلى البحث في فئة org.Apache.commons.httpclient.util.URIUtil، وتحديدًا طريقة encode().استخدمه لتشفير URI لعنوان URL قبل محاولة جلبه.

يبدو أن StackOverflow لا يقوم بتشفيرها:

https://stackoverflow.com/search?q=square+brackets+[url]

من الأفضل أن تقوم بترميز عنوان URL، حيث من الواضح أنها غير مدعومة في جميع خوادم الويب.في بعض الأحيان، حتى عندما يكون هناك معيار، لا يتبعه الجميع.

بحسب ال مواصفات عنوان URL, ، فإن الأقواس المربعة ليست أحرف URL صالحة.

إليك المقتطفات ذات الصلة:

لا تظهر الأحرف "الوطنية" و "علامات الترقيم" في أي الإنتاجات وبالتالي قد لا تظهر في عناوين URL.
وطني { | } | فلاين | [ | ] | \ | ^ | ~
< علامات الترقيم | >

أقواس مربعة [ و ] في عناوين URL غير مدعومة غالبًا.

استبدلهم ب %5B و %5D:

  • باستخدام سطر الأوامر، ويستند المثال التالي على bash و sed:

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
  • باستخدام جافا URLEncoder.encode(String s, String enc)

  • باستخدام PHP rawurlencode() أو urlencode()

    <?php
    echo '<a href="http://example.com/day/',
        rawurlencode('[0-3][0-9]'), '">';
    ?>
    

    انتاج:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    أو:

    <?php
    $query_string = 'day=' . urlencode('[0-3][0-9]') .
                    '&month=' . urlencode('[0-1][0-9]');
    echo '<a href="http://example.com?',
          htmlentities($query_string), '">';
    ?>
    
  • باستخدام لغة البرمجة المفضلة لديك...يرجى توسيع هذه الإجابة عن طريق نشر تعليق أو تحرير هذه الإجابة مباشرة لإضافة الوظيفة التي تستخدمها من لغة البرمجة الخاصة بك؛-)

لمزيد من التفاصيل، راجع آر إف سي 3986 تحديد بناء جملة URL.ال الملحق أ حول %-encoding في سلسلة الاستعلام (بين قوسين ينتميان إلى "الجنرال ديليمس" يكون %-encoded).

تعتبر الأقواس المربعة غير آمنة، لكن غالبية المتصفحات ستقوم بتحليلها بشكل صحيح.وبعد أن قلت أنه من الأفضل استبدال الأقواس المربعة ببعض الأحرف الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top