متوفر أيضًا بلغات أخرى: English · Español · Português · Français
مولّد ترويسة Content-Disposition وفاحصها
اكتب ترويسة تسمّي التنزيل تسميةً صحيحة في كل متصفح، أو الصق واحدة لتعرف بأي اسم سيُحفظ الملف في النهاية.
ما الذي تفعله ترويسة Content-Disposition؟
Content-Disposition هي ترويسة الاستجابة التي تحوّل الصفحة إلى تنزيل وتمنح الملف المحفوظ اسمًا. ولها جزء واجب هو نوع العرض، والمعاملان اللذان يهمّاننا هنا هما filename و*filename. فنوع attachment يأمر المتصفح بأن يسأل أين يحفظ، وinline يأمره بأن يتصرف تصرفه المعتاد، ولذلك لا يفيد inline في شيء إلا إذا اقترن باسم؛ وإلا فهو يطلب عين ما يحدث بلا ترويسة أصلًا.
وثمة حالة ثالثة يحسن معرفتها لأنها تمرّ صامتة: تقول RFC 6266 إن أنواع العرض المجهولة أو غير المعالَجة ينبغي أن تُعامَل معاملة attachment. فالخطأ المطبعي مثل attachement لا ينتهي بعرض الملف بل بتنزيله. وهذه الأداة تنبّه إليه ولا تتجاوزه، لأن الترويسة التي تعمل مصادفةً ترويسةٌ لا يعود إليها أحد.
واسم الملف استرشادي بأقوى معاني الكلمة. فالمواصفة تطلب من المتلقّين حذرًا شديدًا: ألّا يثقوا بمعلومات المجلدات أبدًا، وأن يبقوا المقطع الأخير من المسار وحده، وألّا يكتبوا في أي موضع لم يأذن به المستخدم، وأن يحذفوا حروف التحكّم والمسافات الطرفية أو يستبدلوها. فإن غيّر متصفحٌ اسم ملفك، فقد كان يتّبع القواعد.
كيف تستعملها
- اختر وضعًا. «بناء ترويسة» يأخذ الاسم الذي تريد أن يراه الزائر ويكتب الترويسة له. و«فحص ترويسة» يأخذ ما لديك أصلًا — ملصوقًا باسم الحقل أو من دونه — ويستنتج ما يصنعه به المتلقي.
- في وضع البناء، اكتب الاسم كما هو تمامًا. اختر attachment أو inline، ثم اختر كيف يهجّي البديلُ اللاتيني حرفًا بعلامة: هجاء جوازات السفر يجعل ä تصير ae، أو يمكنك الاكتفاء بحرف a واحد. وانسخ الترويسة بالزر.
- في وضع الفحص، اقرأ السطرين اللذين يهمّان. «الاسم المستعمل» هو ما يحفظه المتصفح الحديث فعلًا، و«مأخوذ من» يقول أي المعاملين قدّمه. وتنقسم الاستنتاجات أدناه إلى أخطاء تكسر شيئًا، وتنبيهات صحيحة لكنها تعمل ضدّك، وملحوظات صحيحة لا تفعل شيئًا البتة.
لماذا ترسل الترويسةُ الصحيحة الاسمَ مرتين
هذا هو الجزء الذي يفاجئ الناس، وهو علة وجود الأداة كلها. تقول RFC 6266 إن المعاملين لا يختلفان إلا في أن *filename يستعمل ترميزًا يجيز حروفًا خارج ISO-8859-1، ثم تقول — وهذا الفيصل — إنهما إذا اجتمعا في قيمة ترويسة واحدة فعلى المتلقّين أن يأخذوا *filename ويهملوا filename. فالنصيحة ليست أن تستبدل أحدهما بالآخر، بل أن ترسلهما معًا.
والعلة هي التوافق. فالصيغة الممتدة جاءت بعد أن انتشرت برمجيات كثيرة، فمن يرسل *filename وحده يترك القديم بلا شيء، ومن يرسل filename وحده يحبس نفسه في مجموعة حروف لا تحسن كتابة أكثر أسماء العالم. وملحق D من الوثيقة نفسها يضع الترتيب مكتوبًا: أدرج filename حين يكفي US-ASCII للتعبير، وأضف *filename حين لا يكفي، وولّد البديل باستبدال متتاليات لاتينية، وضع filename أولًا، لأن بعض المحلّلات القائمة تقف عند أول اسم تفهمه.
وتأتي نصيحة الاستبدال تلك بمثالها الخاص — الحرف ä يصير ae — وهو هجاء جوازات السفر لا هجاء الحرف الواحد، وهو ما تستعمله هذه الأداة افتراضيًّا. والجدول الذي وراءه هو نفسه الذي يستعمله مولّد الروابط اللطيفة في هذا الموقع، مأخوذًا من وثيقة إيكاو 9303، وإنما وُجد لأن الوصفة البديهية خاطئة: فالتطبيع ثم حذف علامات التشكيل يمحو صامتًا نحو اثني عشر حرفًا لاتينيًّا كاملًا بدل أن يطويها، فتصير Ærø حرف r وحده وتفقد Straße حرف ß. وهنا يكون بديل Ærø.txt هو AEroe.txt.
ويعترف ملحق D كذلك بحدّ نصيحته نفسها في جملة واحدة: قد يتعذّر هذا في بعض اللغات. فالاسم المكتوب كله باليابانية أو بالعربية لا هجاء لاتيني له البتة، ولذلك لا تخترع هذه الأداة له هجاءً. بل تكتب جذرًا نائبًا، وتُبقي الامتداد، وتُحصي كل حرف عجزت عن هجائه، وتقول ذلك في الصفحة. وكل متصفح حديث يقرأ *filename ويحصل على الاسم الحقيقي على أي حال؛ ولا يرى النائبَ إلا برنامج قديم حقًّا.
القيمة الممتدة ليست encodeURIComponent
ترميز *filename تعرّفه RFC 8187، وليس هو ترميز العناوين، وإن أشبهه شبهًا يكفي لخداع أكثر الناس. فالقيمة اسمُ ترميز حروف، ثم علامتا اقتباس مفردتان، ثم متتالية كل حرف فيها إما مرمَّز بالنسبة المئوية وإما من مجموعة تسمّيها المواصفة attr-char: وهي حروف الرمز المميّز إلا النجمة والفاصلة العليا وعلامة النسبة.
وقارِن تلك المجموعة بـencodeURIComponent، وهو ما تلجأ إليه كل قصاصة شفرة تقريبًا، تجد الاثنين يختلفان في الاتجاهين. فبمسح ASCII كله، يترك encodeURIComponent أربعة حروف كما هي بالضبط تحرّمها attr-char: الفاصلة العليا، والقوسين، والنجمة. ويرمّز كذلك سبعةً تجيزها attr-char، وذلك غير ضار، لأن الهروب بالنسبة المئوية جائز دائمًا. أما الأربعة فليست غير ضارة، وليست نادرة: فـ«التقرير (النهائي).pdf» و«O'Brien.pdf» اسمان في غاية الاعتياد، وكلاهما يخرج من encodeURIComponent حاملًا حرفًا لا تجيزه القواعد.
وفي الموضع نفسه فخّ ثانٍ. فقد أزالت RFC 8187 في مراجعة 2017 وجوب دعم ISO-8859-1، وصارت تقول إن على المرسلين استعمال UTF-8، فالقيمة التي تعلن ترميزًا آخر متأخرةٌ عن المواصفة وإن كانت لا تزال تعمل. والقيمة الممتدة لا يجوز أن تكون بين علامتَي اقتباس أبدًا — والوثيقة نفسها تلاحظ أن محلّلًا مركّبًا من قطع عامة قد يقبل الصيغة المقتبسة رغم ذلك، وهذا عين ما يجعل خطأً كهذا ينجو من الاختبار.
ما لا تخبرك به هذه الأداة
هذه تفحص النصّ الذي تلصقه ولا شيء غيره. فالمتصفح لا يستطيع جلب ترويسات خادمك، ولذلك لا تدري الأداة أهذه الترويسة التي تنظر إليها هي المُرسَلة فعلًا، ولا أالملف الذي وراءها موجود، ولا أنوع وسائطه يوافق الامتداد. وقد تكون الترويسة لا غبار عليها وهي تصف الاستجابة الخطأ.
ولا تقول شيئًا كذلك عن قانونية الاسم متى نزل على القرص. فأسماء الأجهزة المحجوزة، والحروف التي يمنعها ويندوز، وحدود الطول، مجموعةُ قواعد أخرى لها جواب آخر، وفي هذا الموقع منقٍّ لأسماء الملفات لتلك المسألة. والمشكلتان متشابهتان ولا تشتركان في شيء: هذه عن النجاة من الترويسة، وتلك عن النجاة من نظام الملفات.
وثمة إغفال متعمَّد: امتدادات المعاملات، وهي آلية RFC 2231 التي تقسم القيمة الطويلة بين *filename*0 و*filename*1. فـRFC 8187 تقرّر أن الامتدادات غير لازمة في ترويسات HTTP ولا تأخذ بها، فالترويسة التي تستعملها خارج ما تحلّله هذه الأداة. وإن كانت عندك واحدة فهي من برنامج يتّبع عرفًا أقدم من أعراف MIME في موضع لم يطلبه قط.
وأخيرًا، لا شيء من هذا يجعل اسم الملف مُلزِمًا. فالمواصفة قاطعة: المتلقي يعدّه نصيحة، وله أن يستبدل اسمًا يعني شيئًا خاصًّا في نظام الملفات، وعليه أن يتحقق من أن أي امتداد يثق به امتدادٌ آمن. وإنما تشتري الترويسةُ الصحيحة أفضل فرصة لأن يظهر الاسم الذي أردته، لا ضمانًا بظهوره.
لماذا هي مجانية؟
بناء الترويسة وتحليلها عملُ نصّ يجري في متصفحك. ولا خادم في الأمر، فلا شيء يُحاسَب عليه ولا حساب يُنشأ.
ولا يُرفع شيء ولا يُحفظ شيء. أعد تحميل الصفحة تجدها قد نسيت اسم ملفك.