406 Not Acceptable: عندما يفشل التفاوض على المحتوى

406 Not Acceptable يعني أن الخادم لا يملك نسخة من المورد تطابق ترويسات Accept عند العميل، ولا يرسل نسخة افتراضية.

افحص رمز حالة رابط

406 Not Acceptable يعني أن الخادم يملك المورد لكن ليس بأي صيغة قال العميل إنه يقبلها. و«Accept» هنا تشير إلى ترويسات التفاوض على المحتوى (content negotiation) مثل Accept وAccept-Language وAccept-Encoding. لكن في الواقع تأتي معظم حالات 406 على المواقع من قواعد أمنية لا من التفاوض. (ونظيره المعاكس هو 415 الذي يرفض صيغة ما يرسله العميل.)

التعريف

يعرّف RFC 9110، القسم 15.5.7 الرمز 406 بأن المورد المستهدف ليس له تمثيل حالي مقبول لدى العميل بحسب ترويسات التفاوض عنده، والخادم غير راغب في تقديم نسخة افتراضية. وتترك المواصفة للخوادم خيارًا: ففي ترويسة Accept يمكن للخادم إما أن يرسل 406 أو يتجاهل الترويسة ويرد كأن المورد لا يخضع للتفاوض. وبالنسبة للصفحات العامة، يكون الخيار الثاني أفضل في كل الأحوال تقريبًا.

الأسباب الشائعة

  • ModSecurity على الاستضافة المشتركة. تضبط استضافات كثيرة جدار حماية تطبيقات الويب هذا ليرد بـ 406 على الطلبات المحظورة. فأي نموذج أو رابط أو سلسلة استعلام تطابق قاعدة تُفعّله.
  • تفاوض صارم في API: عميل يطلب Accept: application/xml من واجهة لا تنتج إلا JSON.
  • تفاوض على اللغة أو الصيغة، مثل MultiViews في Apache، لا يجد نسخة مطابقة.

التأثير على السيو

الرمز 406 من فئة 4xx، فتعامله Google مثل البقية: لا يُفهرس الرابط وتُزال المدخلات الموجودة (وثائق Google). ترسل الزواحف ترويسات Accept عامة إلى حد كبير، لكن قاعدة صارمة أو WAF قد يرفضها، والصفحات التي تردّ على الزواحف بـ 406 تختفي من البحث.

كيف تصلحه

  • أصحاب المواقع: اسأل استضافتك أي قاعدة ModSecurity عملت (معرّف القاعدة موجود في سجل التدقيق لديهم) واطلب تعديلها أو تعطيلها لموقعك.
  • المطورون: ارجع إلى تمثيل افتراضي بدل الفشل. قدّم HTML لروابط الصفحات أيًّا كانت قيمة Accept، وعندما تتفاوض فعلًا أضف Vary: Accept كي تفصل ذواكر التخزين المؤقت بين النسخ.
  • المواقع متعددة اللغات: لا تجعل الصفحة تعتمد على Accept-Language. امنح كل لغة رابطها الخاص واربطها بـ hreflang.

كيف تتحقق

استخدم أداة فحص حالة HTTP لترى هل تعيد الصفحة 406 لعميل محايد، واستخدم أداة فحص ترويسات HTTP لفحص Vary وContent-Type. وهكذا يبدو 406 صادر من API:

HTTP/1.1 406 Not Acceptable
Content-Type: application/json
Vary: Accept

{"error":"Supported types: application/json, text/csv"}

الأسئلة الشائعة

لماذا يعيد إرسال النموذج الخطأ 406 Not Acceptable؟

في الاستضافة المشتركة يكون السبب عادةً أن ModSecurity يحجب شيئًا في البيانات المرسلة. اسأل استضافتك أي قاعدة عملت واطلب تعديلها لموقعك.

هل ينبغي أن تعيد واجهة API الرمز 406؟

فقط عندما تعجز فعلًا عن إنتاج أي صيغة يقبلها العميل. تكتفي واجهات كثيرة بإعادة صيغتها الافتراضية، وهي عادةً JSON، وهذا مسموح في المواصفة أيضًا.

هل يمكن أن يضر خطأ 406 بالسيو؟

نعم، إذا تلقته الزواحف على روابط الصفحات: تعامله Google مثل رموز 4xx الأخرى وتُسقط الصفحة. يجب أن تعود الصفحات دائمًا إلى HTML الافتراضي.