درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
نشانه
برنامه مشتری کد وضعیت HTTP 400 Bad Request را با کد خطای
protocol.http.DuplicateHeader بهعنوان پاسخ برای فراخوانیهای API دریافت میکند.
پیام خطا
برنامه کارخواه کد پاسخ زیر را دریافت میکند:
HTTP/1.1 400 Bad Request
علاوهبراین، ممکن است پیام خطایی مشابه پیام زیر مشاهده کنید:
{
"fault":{
"faultstring":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}علل احتمالی
این خطا زمانی رخ میدهد که سرصفحه HTTP خاصی که در Apigee Edge اجازه ندارد تکراری باشد، بیشاز یکبار با مقادیر یکسان یا متفاوت بهعنوان بخشی از درخواست HTTP ارسالشده توسط کارخواه به Apigee Edge ظاهر شود.
طبق
RFC 7230، بخش 3.2.2: ترتیب فیلد، فرستنده نباید چندین فیلد سرایند
با نام فیلد یکسان در پیام تولید کند، مگر اینکه کل مقدار فیلد برای آن
فیلد سرایند بهعنوان فهرست جداشده با کاما تعریف شده باشد، [یعنی #(values)] یا فیلد سرایند یک
استثنای شناختهشده است. اگر Apigee Edge سرایند خاصی را پیدا کند که اجازه ندارد
بیشاز یک بار در درخواست HTTP ارسالشده توسط مشتری تکرار شود،
با 400 Bad Request و کد خطای
protocol.http.DuplicateHeader پاسخ میدهد.
در اینجا دلایل احتمالی این خطا آورده شده است:
| علت | شرح | دستورالعملهای عیبیابی برای موارد زیر قابلاجرا است |
|---|---|---|
| سرایند تکراری در درخواست | درخواست HTTP از برنامه مشتری به Apigee حاوی سرصفحههای تکراری است. | کاربران «فضای ابری خصوصی و عمومی لبهای» |
مراحل متداول تشخیص خرابی
برای تشخیص این خطا، از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
پایش میانای برنامهسازی کاربردی
برای تشخیص خطا بااستفاده از «پایش API»:
- بهعنوان کاربری با نقش مناسب به سیستم Apigee Edge UI وارد شوید.
به سازمانی که میخواهید مشکل را در آن بررسی کنید بروید.

- به صفحه تجزیهوتحلیل > پایش API > بررسی پیمایش کنید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید انتخاب کنید.
- مطمئن شوید که فیلتر «پراکسی» روی همه تنظیم شده باشد.
- رسم کد خطا دربرابر زمان.
سلولی را که کد خطای
protocol.http.DuplicateHeaderدر آن وجود دارد انتخاب کنید، همانطور که در زیر نشان داده شده است:
اطلاعات مربوط به کد خطا
protocol.http.DuplicateHeaderبهصورت زیر نمایش داده میشود:
- روی مشاهده گزارشها کلیک کنید و ردیف درخواست ناموفق را ازهم باز کنید.
- از پنجره گزارشها، جزئیات زیر را یادداشت کنید:
- کد وضعیت:
400 - منبع خطا:
apigee - کد خطا:
protocol.http.DuplicateHeader.
- کد وضعیت:
- اگر منبع خطا مقدار
apigeeیاMPرا داشته باشد و کد خطا مقدارprotocol.http.DuplicateHeaderرا داشته باشد، این نشان میدهد که درخواست HTTP از کاربر حاوی سرایندهای تکراری بوده است.
ابزار ردیابی
NGINX
برای تشخیص خطا بااستفاده از گزارشهای دسترسی NGINX:
- اگر کاربر «ابر خصوصی» هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین
اطلاعات کلیدی درباره خطاهای
400HTTP استفاده کنید. گزارشهای دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logمکان: ORG، ENV، و PORT# با مقادیر واقعی جایگزین میشوند.
- جستجو کنید تا ببینید آیا درطول مدت مشخصی خطاهای
400وجود دارد (اگر مشکل در گذشته رخ داده است) یا اینکه آیا هنوز درخواستهایی با400ناموفق هستند یا نه. اگر خطاهای
400را با X-Apigee-fault-code مطابق با مقدارprotocol.http.DuplicateHeaderپیدا کردید، مقدار X-Apigee-fault-source را تعیین کنید.نمونه خطای ۴۰۰ از گزارش دسترسی NGINX:
ورودی نمونه بالا از گزارش NGINX Access مقادیر زیر را برای X-Apigee- fault-code و X-Apigee-fault-source: دارد:
سرایندهای پاسخ مقدار X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source MP
علت: سرایند تکراری در درخواست
تشخیص
- کد خطا و منبع خطا را برای خطای مشاهدهشده بااستفاده از API «پایش» یا گزارشهای دسترسی NGINX که در مراحل تشخیص خرابی متداول توضیح داده شده است تعیین کنید.
- اگر منبع خطا مقدار
apigeeیاMPداشته باشد، این یعنی درخواستی که برنامه مشتری به Apigee ارسال کرده است حاوی سرایندهای تکراری است. بااستفاده از یکی از روشهای زیر میتوانید سرصفحه واقعی را که بیشاز یک بار بهعنوان بخشی از درخواست ارسال میشود تعیین کنید:
پیام خطا
استفاده از پیام خطا
اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به
faultstringمراجعه کنید.faultstringحاوی نام سرایندی است که بیشاز یکبار ارسال شده است.پیام خطای نمونه:
"faultstring":"Duplicate Header \"Expires\""
- در پیام خطای بالا، میتوانید ببینید که سرایند
Expiresبیشاز یکبار ارسال شده است، همانطور که درfaultstringدیده میشود.
درخواست واقعی
استفاده از درخواست واقعی
اگر به درخواست واقعی که توسط برنامه مشتری ایجاد شده است دسترسی دارید، مراحل زیر را انجام دهید:
- فهرست سرایندهای ارسالشده در درخواست را تأیید کنید.
- اگر متوجه شدید که سرایند خاصی بیشاز یکبار در درخواست با مقدار یکسان یا مقادیر متفاوت ظاهر میشود، این دلیل بروز این خطا است.
درخواست نمونه:
curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
در درخواست مثال بالا، سرصفحه
Expiresبیشاز یکبار ارسال شده است. بنابراین، این درخواست با خطای400 Bad Requestو کد خطایprotocol.http.DuplicateHeaderناموفق است.- یا اگر به گزارشهای کلاینت دسترسی دارید، میتوانید ببینید آیا اطلاعاتی درباره درخواست واقعی که به Apigee Edge ارسال شده است دارید یا نه و سرصفحهای را که بیش از یکبار ارسال شده است تعیین کنید.
وضوح
رفع تکراری بودن
گزینه ۱ [گزینه توصیهشده]: برنامه کارخواه را اصلاح کنید تا سربرگهای تکراری را اضافه نکند
- دلیل ارسال سرصفحه تکراری توسط مشتری خاص را تجزیهوتحلیل کنید. برای مثال،
Expiresدر مورد بالا. تأیید کنید که پراکسیهای API میتوانند سرصفحه تکراری را بپذیرند. معمولاً طبق مشخصات HTTP RFC7230 مطلوب نیست. - اگر مطلوب نیست، برنامه کارخواهتان را اصلاح کنید تا سربرگهای تکراری ارسال نکند.
در مثال بالا، متوجه شدیم که سرایند
Expiresدو بار با مقدار یکسان ارسال شده است که مطلوب نیست. با ارسال سرصفحهExpiresفقط یکبار، همانطور که در زیر نشان داده شده است، میتوانید این مشکل را برطرف کنید:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- اگر مطلوب است و میخواهید سرصفحههای تکراری را مجاز کنید، به گزینه شماره ۲ بااستفاده از دارایی CwC بروید.
CwC
گزینه شماره ۲: استفاده از دارایی CwC
Apigee دارایی
CwC HTTPHeader.<HeaderName> را ارائه میدهد که به برنامههای
کاربردی و سرورهای هدف اجازه میدهد سرصفحههای تکراری را به پراکسیهای API در Apigee Edge ارسال کنند.
| دارایی CwC | مقادیر |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
برای مثال، دارایی زیر را میتوان در «پردازشگرهای پیام» تنظیم کرد تا مقادیر تکراری و
چندین مقدار برای سرایند Expires مجاز شود.
HTTPHeader.Expires=allowDuplicates, multiValued
- اگر کاربر «ابر خصوصی» هستید، میتوانید دارایی را پیکربندی کنید تا
از ایجاد خطای
400 Bad Requestتوسط Apigee Edge جلوگیری کنید، حتی اگر درخواست شامل سربرگهای تکراری باشد، بااستفاده از راهنمای گامبهگام پیکربندی «پردازشگرهای پیام» برای استفاده از سربرگهای تکراری. - اگر کاربر «ابر عمومی» هستید، برای پیکربندی این دارایی برای سازمانتان با پشتیبانی Apigee Edge تماس بگیرید.
مشخصات
Apigee انتظار دارد برنامه کارخواه براساس مشخصات زیر در RFC، سرایندهای تکراری را بهعنوان بخشی از درخواست ارسال نکند:
| مشخصات |
|---|
| RFC 7230، بخش ۳.۲.۲: ترتیب فیلد |
| RFC 7230، بخش ۳.۲ فیلدهای سرایند |
اگر هنوز به کمک «پشتیبانی Apigee» نیاز دارید، به باید اطلاعات تشخیصی را جمعآوری کنید بروید.
باید اطلاعات تشخیص خرابی را جمعآوری کند
اطلاعات تشخیص خرابی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر «ابر عمومی» هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پراکسی میانای برنامهسازی کاربردی
- فرمان کامل
curlبرای بازتولید خطای400استفاده شد - فایل ردیابی برای درخواستهای API
اگر کاربر «ابر خصوصی» هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهدهشده برای درخواستهای ناموفق
- نام محیط
- دسته پراکسی میانای برنامهسازی کاربردی
- فرمان
curlرا که برای بازتولید خطای400استفاده کردید تکمیل کنید - فایل ردیابی برای درخواستهای API
گزارشهای دسترسی NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logمکان: ORG، ENV، و PORT# با مقادیر واقعی جایگزین میشوند.
- گزارشهای سیستم «پردازشگر پیام»
/opt/apigee/var/log/edge-message-processor/logs/system.log