אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
בהתאם למפרט HTTP, RFC 7230, סעיף 3.2.2: סדר השדות, Apigee Edge מצפה שבקשת ה-HTTP מהלקוח או תגובת ה-HTTP משרת הקצה העורפי לא יכילו את אותה כותרת שמועברת יותר מפעם אחת עם אותם ערכים או ערכים שונים, אלא אם יש חריג לכותרת הספציפית ומותר להכיל כפילויות.
כברירת מחדל, ב-Apigee Edge אפשר להעביר כפילויות ומספר ערכים לרוב כותרות ה-HTTP. עם זאת, המערכת לא מאפשרת להשתמש בכותרות מסוימות שמפורטות בקטע כותרות שאסור להשתמש בהן עם ערכים כפולים או עם כמה ערכים. לכן:
- תקבלו
400 Bad Requestעם קוד השגיאהprotocol.http.DuplicateHeaderאם הלקוח שולח בקשת HTTP עם כותרת מסוימת יותר מפעם אחת, או עם כמה ערכים לכותרות HTTP שאסור להן להכיל כפילויות או כמה ערכים ב-Apigee Edge. - באופן דומה, תקבלו את השגיאה
502 Bad Gatewayעם קוד השגיאהprotocol.http.DuplicateHeaderאם שרת הקצה העורפי שולח תגובת HTTP עם כותרת מסוימת יותר מפעם אחת או עם כמה ערכים לכותרות HTTP שאסור להן להכיל כפילויות או כמה ערכים ב-Apigee Edge.
הפתרון המומלץ לטיפול בשגיאות האלה הוא לתקן את אפליקציית הלקוח ואת שרת הקצה העורפי כדי שלא ישלחו כותרות כפולות, ולפעול בהתאם למפרט RFC 7230, section 3.2.2: Field Order, כפי שמוסבר במדריכים הבאים לפתרון בעיות:
עם זאת, במקרים מסוימים יכול להיות שתרצו להוסיף חריג כדי לכלול כפילויות וכמה ערכים בכותרות HTTP מסוימות. במקרים כאלה, אפשר לאפשר כותרות כפולות וכמה ערכים לכותרת HTTP ספציפית על ידי הגדרת מאפיין HTTPHeader.HEADER_NAME ברמה של מעבד ההודעות.
במאמר הזה מוסבר על המאפיין הזה, איך להפעיל אותו כדי להימנע מהשגיאות שצוינו למעלה ומהן השיטות המומלצות לשימוש בו.
מאפייני כותרת HTTP שמאפשרים כפילויות וכמה ערכים
ב-Apigee Edge יש שני מאפיינים שמאפשרים לשלוט בהתנהגות של אישור כפילויות וערכים מרובים בכותרות HTTP. שימו לב שאפשר להגדיר את ההגדרות האלה רק ב-Message Processors באמצעות תחביר הטוקן שמוסבר במאמר איך מגדירים את Edge.
| שם הנכס | תיאור | ערכים מותרים |
|---|---|---|
HTTPHeader.ANY |
המאפיין הזה מציין אם מותרים כפילויות או כמה ערכים לכל כותרות ה-HTTP, כולל הכותרות המותאמות אישית שנשלחות כחלק מבקשת ה-HTTP שהלקוח שולח או מתגובת ה-HTTP ששרת הקצה העורפי שולח ל-Apigee Edge. ערך ברירת מחדל:
|
|
|
המאפיין הזה משמש לשינוי ההתנהגות של כותרת ספציפית ממה שצוין על ידי |
כנ"ל. |
כותרות שאסור להזין בהן ערכים כפולים או כמה ערכים
כמו שהוסבר קודם, ב-Apigee Edge מותרות כפילויות וערכים מרובים ברוב כותרות ה-HTTP כברירת מחדל. הסיבה לכך היא שהמאפיין HTTPHeader.ANY מוגדר עם הערך multiValued, allowDuplicates..
ההגדרה נכתבה מחדש
במקרה של כותרות ספציפיות, ההגדרה שמוגדרת כברירת מחדל מוחלפת באמצעות אחת מהשיטות הבאות:
HTTPHeader.HEADER_NAME=multiValued, allowDuplicatesההגדרה הזו לא משנה את התנהגות ברירת המחדל. כלומר, מותר שיהיו כפילויות וכמה ערכים בכותרת הספציפית
.HTTPHeader.HEADER_NAME=ההגדרה הזו משנה את התנהגות ברירת המחדל. כלומר, אסור שיהיו כפילויות וכמה ערכים בכותרת הספציפית.
קביעת כותרות שאסור שיהיו בהן ערכים כפולים או כמה ערכים
בקטע הזה מוסבר איך לזהות את הפרטים הבאים:
- הכותרות הספציפיות שאסור שיהיו להן כפילויות וכמה ערכים בהגדרה של Apigee Edge Private Cloud, וגם
- הכותרות הספציפיות עם ההגדרה הקיימת
במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPHeader.בספרייה/opt/apigee/edge-message-processor/confכמו שמוצג בהמשך:grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
פלט לדוגמה:
# grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued … <snipped> /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host= /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires= /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates … <snipped>
- כמו שמוסבר בקטע ההגדרה נכתבה מחדש, שימו לב לפרטים הבאים בפלט לדוגמה שלמעלה:
- כותרת ה-HTTP
Connectionמוחלפת, אבל מותר שיהיו בה כפילויות וכמה ערכים - הכותרות HTTP
Hostו-Expiresנדרסות ואסור שיהיו להן כפילויות וערכים מרובים - כותרת ה-HTTP
Dateמוחלפת ומותר להכיל כפילויות, אבל אסור להכיל כמה ערכים - כל הכותרות שמופיעות כאן (
Connection, Host, Expiresו-Dateבדוגמה שלמעלה) נקראות כותרות עם הגדרה קיימת במסמך הזה.
- כותרת ה-HTTP
התנהגות של Apigee Edge
בטבלה הבאה מתואר אופן הפעולה של Apigee Edge כשכותרות נשלחות ככפילויות וכערכים מרובים, בהתאם לאופן שבו המאפיינים HTTPHeader מוגדרים במעבדי ההודעות, עם דוגמה HTTPHeader של test-header.
| בקשה | כותרות יוצאות על סמך הערך של conf/http.properties+HTTPHeader.test-header= | |||
|---|---|---|---|---|
| <Blank> | allowDuplicates | multiValued | allowDuplicates, multiValued (ברירת מחדל) | |
test‑header=a,b |
test‑header=a,b |
test‑header=a,b |
באופן פנימי, אנחנו מחלקים את
ואז מוצגת השגיאה |
באופן פנימי, אנחנו מחלקים את
אבל אז הטופס המקורי נשלח אל היעד. |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
לפני שמתחילים
לפני שמבצעים את השלבים במאמר הזה, חשוב להבין איך מגדירים נכסים ב-Edge on Private Cloud, כמו שמתואר במאמר איך מגדירים את Edge.
הגדרת allowDuplicates וכמה ערכים לכותרות
כמו שמוסבר במאמר מאפייני כותרת HTTP שמאפשרים כפילויות ומספר ערכים,הערך של המאפיין HTTPHeader.ANY = allowDuplicates,
multiValued מרמז שכל הכותרות יכולות לכלול כפילויות ומספר ערכים ב-Apigee Edge. עם זאת, יש כותרות מסוימות שהערכים שלהן נמחקים באופן מפורש כדי שלא יהיו כותרות כפולות או ערכים מרובים, באמצעות המאפיין HTTPHeader.HEADER_NAME.
בקטע הזה מוסבר איך להגדיר את המאפיין HTTPHeader.HEADER_NAME כדי לאפשר כפילויות וכמה ערכים לכל כותרות ה-HTTP האלה במעבדי ההודעות, באמצעות הטוקן המתאים לפי התחביר שמתואר במאמר איך מגדירים את Edge.
בקטע הזה נשתמש ב-Expires (וב-myheader) ככותרת לדוגמה שבה אנחנו רוצים לאפשר כפילויות וכמה ערכים, כמו שמוסבר בהמשך:
-
קובעים את הערך הנוכחי של המאפיין
HTTPHeaderHEADER_NAMEכדי לוודא שהוא לא מופעל כבר כדי לאפשר כפילויות וכמה ערכים באמצעות הפקודה הבאה:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
לדוגמה, אם מנסים להגדיר את המאפיין עבור הכותרת
Expires, צריך לבדוק את הערך הנוכחי של טוקן המאפייןHTTPHeader.Expiresבמעבד ההודעות:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
הפלט של הפקודה שלמעלה יהיה אחד מהבאים:
- אם הנכס מוגדר כריק, המשמעות היא שהערך נדרס (וזהו כותר עם הגדרה קיימת מראש) כדי שלא יתאפשרו כותרות כפולות וכמה ערכים. כלומר, אסור לשלוח את הכותרת
Expiresיותר מפעם אחת כחלק מבקשת ה-HTTP או מתגובת ה-HTTP אל Apigee. - אם אין היטים לנכס הספציפי, המשמעות היא שהערך לא מוחלף (וזו לא כותרת עם הגדרה קיימת). המשמעות היא שאפשר לשלוח את הכותרת הספציפית יותר מפעם אחת (מותרים כפילויות) כחלק מבקשת ה-HTTP או מתגובת ה-HTTP אל Apigee Edge.
- המאפיין מוגדר עם הערך
allowDuplicates, multiValued, כלומר הערך מוחלף באופן מפורש (וזו כותרת עם הגדרה קיימת). המשמעות היא שאפשר לשלוח את הכותרת הספציפית יותר מפעם אחת (מותר לשלוח כפילויות) כחלק מבקשת ה-HTTP או מתגובת ה-HTTP אל Apigee.
פלט לדוגמה של פקודת החיפוש:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
בדוגמה של הפלט שלמעלה אפשר לראות שהמאפיין
HTTPHeader.Expiresמוגדר כריק. כלומר, המאפיין is overwritten משתנה לערך not allow duplicate or multiple values עבור הכותרתExpires. - אם הנכס מוגדר כריק, המשמעות היא שהערך נדרס (וזהו כותר עם הגדרה קיימת מראש) כדי שלא יתאפשרו כותרות כפולות וכמה ערכים. כלומר, אסור לשלוח את הכותרת
- אם שמתם לב שהמאפיין שמתאים לכותרת הספציפית נכתב מחדש באופן מפורש כדי שלא לאפשר ערכים כפולים או כמה ערכים כמו בפלט לדוגמה שלמעלה, רק אז מבצעים את השלבים הבאים. אם הוא לא נכתב מחדש באופן מפורש, אפשר לדלג על שאר השלבים בקטע הזה.
- עריכה. אם הוא לא קיים, אפשר ליצור אותו:
/opt/apigee/customer/application/message-processor.properties
לדוגמה, כדי לפתוח את הקובץ באמצעות vi, מזינים את הפקודה הבאה:
vi /opt/apigee/customer/application/message-processor.properties
- מוסיפים שורה בפורמט הבא:
conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
- שומרים את השינויים.
מוודאים שקובץ המאפיינים נמצא בבעלות המשתמש
apigee. אם לא, מריצים את הפקודה הבאה:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
מפעילים מחדש את מעבד ההודעות:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
כדי להפעיל מחדש בלי להשפיע על התנועה, אפשר לעיין במאמר בנושא הפעלה מחדש הדרגתית של מעבדי הודעות בלי להשפיע על התנועה.
- אם יש לכם יותר ממעבד הודעות אחד, צריך לחזור על השלבים שלמעלה בכל מעבדי ההודעות.
אימות הכותרת מוגדרת כך שיש בה כפילויות ומספר ערכים
בקטע הזה מוסבר איך לוודא שהמאפיין HTTPHeader.HEADER_NAME של כותרת מסוימת עודכן בהצלחה כדי לאפשר כפילויות במעבדי ההודעות.
נשתמש ב-Expires ככותרת לדוגמה ונבדוק אם המאפיין המתאים HTTPHeader.Expires עודכן.
למרות שמשתמשים באסימון conf_http_HTTPHeader.Expires כדי לעדכן את הערך ב-מעבד בקשות, צריך לוודא שהערך החדש הוגדר בנכס HTTPHeader.Expires.
- במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPHeader.HEADER_NAMEבספרייה/opt/apigee/edge-message-processor/confובודקים אם הוא הוגדר עם הערך החדש כמו שמוצג בהמשך:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
לדוגמה, אם רוצים לוודא שהמאפיין
HTTPHeader.Expiresמוגדר עם הערך החדש, מריצים את הפקודה הבאה:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
- אם הערך החדש מוגדר בהצלחה עבור
HTTPHeader.HEADER_NAMEבמעבד ההודעות, הפקודה שלמעלה מציגה את הערך החדש בקובץhttp.properties. דוגמה לתוצאה של הפקודה שלמעלה אחרי שמגדירים את
allowDuplicatesואתmultiValued:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- בדוגמה של הפלט שלמעלה, שימו לב שהמאפיין
HTTPHeader.Expiresהוגדר עם הערך החדשallowDuplicates, multiValuedב-http.properties. המשמעות היא שההתנהגות שמאפשרת כפילויות ומספר ערכים ב-HTTPHeaderהוגדרה בהצלחה ב-Message Processor (מעבד ההודעות). - אם עדיין מוצג הערך הישן של המאפיין
HTTPHeader.HEADER_NAME, צריך לוודא שפעלתם לפי כל השלבים שמפורטים במאמר הגדרת allowDuplicates וערכים מרובים לכותרות. אם פספסתם שלב כלשהו, צריך לחזור על כל השלבים בצורה נכונה.חשוב לוודא ששרתי ה-proxy פועלים כמצופה, במיוחד אם יש לוגיקה פונקציונלית להשגת הכותרות ולהגדרתן ב-proxy.
- אם עדיין אין לך אפשרות לשנות את המאפיין, אפשר לפנות אל התמיכה של Apigee Edge.
השבתת allowDuplicates עבור כותרות
בקטע הזה מוסבר איך להגדיר את המאפיין HTTPHeader.{Headername} כדי לא לאפשר כפילויות ומספר ערכים בכותרת HTTP ספציפית במעבדי ההודעות, באמצעות הטוקן המתאים לפי התחביר שמתואר במאמר איך מגדירים את Edge.
בקטע הזה נשתמש ב-Expires (וב-myheader) כדוגמה לכותרת שלא נרצה לאפשר כפילויות שלה, כפי שמוסבר בהמשך:
-
כדי לוודא שהמאפיין
HTTPHeaderHEADER_NAMEלא מושבת, כך שאפשר יהיה להשתמש בערכים כפולים ובכמה ערכים, צריך להשתמש בפקודה הבאה כדי לקבוע את הערך הנוכחי שלו:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
לדוגמה, אם מנסים להגדיר את הנכס עבור הכותרת
Expires, בודקים את הערך הנוכחי של טוקן הנכסHTTPHeader.Expiresבמעבד ההודעות:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
הפלט של הפקודה שלמעלה יהיה אחד מהבאים:
- אם הנכס מוגדר כריק, המשמעות היא שהערך נכתב מחדש כ-NOT כדי לאפשר כותרות כפולות וכמה ערכים. כלומר, אסור לשלוח את הכותרת
Expiresיותר מפעם אחת כחלק מבקשת HTTP או מתגובת HTTP אל Apigee. - אם אין היטים למאפיין הספציפי, המשמעות היא שהערך לא נכתב מחדש, וזו כותרת NOT עם הגדרה קיימת. המשמעות היא שאפשר לשלוח את הכותרת הספציפית יותר מפעם אחת (מותרים כפילויות) כחלק מבקשת ה-HTTP או מתגובת ה-HTTP אל Apigee Edge.
- אם המאפיין מוגדר עם הערך
allowDuplicates, multiValued, המשמעות היא שהערך נכתב מחדש באופן מפורש וזו תצורה קיימת. עם זאת, המשמעות היא שאפשר לשלוח את הכותרת הספציפית יותר מפעם אחת (מותר לשלוח כפילויות) כחלק מבקשת HTTP או מתגובת HTTP ל-Apigee.
פלט לדוגמה מס' 1
פלט לדוגמה מספר 1 של פקודת החיפוש:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
בדוגמה של הפלט אפשר לראות שהמאפיין
HTTPHeader.Expiresמוגדר לערךallowDuplicates, multiValued. המשמעות היא שהמאפיין is overwritten to allow duplicate or multiple values עבור הכותרתExpires.פלט לדוגמה מס' 2
דוגמה לפקודה ולפלט מספר 2 של פקודת החיפוש
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
הפלט לדוגמה לא מציג פלט, מה שאומר שמאפיין
HTTPHeader.myheaderמוגדר ל-allowDuplicates, multiValuedכברירת מחדל. זה גם אומר שהמאפיין לא נכתב מחדש עבור הכותרת myheader, - אם הנכס מוגדר כריק, המשמעות היא שהערך נכתב מחדש כ-NOT כדי לאפשר כותרות כפולות וכמה ערכים. כלומר, אסור לשלוח את הכותרת
- אם אתם מבחינים באחת מהבעיות הבאות, צריך לבצע את שאר השלבים בקטע הזה:
- המאפיין שמתאים לכותרת הספציפית מוחלף כדי לאפשר כפילויות וכמה ערכים כמו בדוגמה Sample output #1 שלמעלה (כותרת עם הגדרה קיימת)
- אין היטים לנכס שמתאים לכותרת הספציפית, כמו בפלט לדוגמה מספר 2 שלמעלה (לא כותרת עם הגדרה קיימת)
אם לא, מדלגים על שאר השלבים בקטע הזה.
- עורכים את הקובץ הבא. אם הוא לא קיים, אפשר ליצור אותו.
/opt/apigee/customer/application/message-processor.properties
לדוגמה, כדי לפתוח את הקובץ באמצעות vi, מזינים את הפקודה הבאה:
vi /opt/apigee/customer/application/message-processor.properties
- מוסיפים לקובץ המאפיינים שורה בפורמט הבא:
הגדרה קיימת
תרחיש מספר 1: כותרת עם הגדרה קיימת מראש:
conf_http_HTTPHeader.Expires=
אין הגדרה קיימת
תרחיש 2: לא מדובר בכותרת עם הגדרה קיימת מראש:
conf/http.properties+HTTPHeader.myheader=
- שומרים את השינויים.
- מוודאים שקובץ המאפיינים נמצא בבעלות המשתמש
apigee. אם לא, מריצים את הפקודה הבאה:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- מפעילים מחדש את מעבד ההודעות:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
כדי להפעיל מחדש בלי להשפיע על התנועה, אפשר לעיין במאמר בנושא הפעלה מחדש הדרגתית של מעבדי הודעות בלי להשפיע על התנועה.
- אם יש לכם יותר ממעבד הודעות אחד, חוזרים על השלבים שלמעלה בכל מעבד ההודעות.
אימות הכותרת מוגדר כך שלא ניתן להשתמש בערכים כפולים או בכמה ערכים
בקטע הזה מוסבר איך לוודא שהמאפיין HTTPHeader.HEADER_NAME של כותרת ספציפית עודכן בהצלחה כך שלא יתאפשרו כפילויות במעבדי ההודעות.
נשתמש ב-Expires (וב-myheader) כדוגמה לכותרת ונבדוק אם הנכס התואם HTTPHeader.Expires (וב-HTTPHeader.myheader) עודכן.
במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPHeader.HEADER_NAMEבספרייה/opt/apigee/edge-message- processor/confובודקים אם הוא הוגדר עם הערך החדש כמו שמוצג בהמשך:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
לדוגמה, אם רוצים לבדוק שהמאפיין
HTTPHeader.Expiresמוגדר עם הערך החדש, אפשר להריץ את הפקודה הבאה:הגדרה קיימת
grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
אין הגדרה קיימת
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
- אם הערך החדש של כותרת ה-HTTP מוגדר בהצלחה עבור
HTTPHeader.HEADER_NAMEI במעבד ההודעות, הפקודה שלמעלה מציגה את הערך החדש בקובץhttp.properties. - תוצאה לדוגמה מהפקודה שלמעלה אחרי השבתה של
allowDuplicates:הגדרה קיימת
תרחיש מספר 1: כותרת Expires (כותרת עם הגדרה קיימת)
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
אין הגדרה קיימת
תרחיש מספר 2: הכותרת myheader (לא כותרת עם הגדרה קיימת מראש)
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
- בדוגמת הפלט שלמעלה, שימו לב שהמאפיין
HTTPHeader.Expires( ו-HTTPHeader.myheader) הוגדר עם הערך החדש {blank}ב-http.properties. המשמעות היא שההתנהגות שמאפשרת כפילויות וכמה ערכים עבור כותרת ה-HTTP הספציפיתExpires(ו-myheader) מושבתת בהצלחה במעבד ההודעות. אם עדיין מוצג הערך הישן של המאפיין
HTTPHeader.Expires (or HTTPHeader.myheader), צריך לוודא שפעלתם לפי כל השלבים שמפורטים במאמר בנושא הגדרת allowDuplicates וערכים מרובים לכותרות. אם פספסתם שלב כלשהו, צריך לחזור על כל השלבים בצורה נכונה.חשוב לוודא ששרתי ה-proxy פועלים כמצופה, במיוחד אם יש לוגיקה פונקציונלית לקבלת הכותרות ולהגדרתן ב-proxy.
- אם עדיין אין לך אפשרות לשנות את המאפיין, אפשר לפנות אל התמיכה של Apigee Edge.