אתם צופים במסמכי העזרה של Apigee Edge.
כניסה למסמכי העזרה של Apigee X. info
בהתאם למפרט HTTP RFC 7230, סעיף 3.2.2: Field Order, 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, קטע 3.2.2: Field Order כפי שמוסבר במסמכי ה-playbook הבאים לפתרון בעיות:
עם זאת, במקרים מסוימים כדאי להוסיף חריג כדי לכלול כפילויות וערכים מרובים בחלק מכותרות ה-HTTP. במצבים כאלה אפשר לאשר כותרות כפולות וערכים מרובים לכותרת HTTP ספציפית, על ידי הגדרת המאפיין HTTPHeader.HEADER_NAME
ברמת מעבד ההודעות.
במסמך הזה מפורט מידע על הנכס הזה, מוסבר איך להפעיל את הנכס הזה כדי למנוע את השגיאות שצוינו למעלה, ומפורטות שיטות מומלצות בנושא.
מאפייני כותרות HTTP שמאפשרים כפילויות וערכים מרובים
ב-Apigee Edge יש את שני המאפיינים הבאים שבעזרתם אפשר לקבוע את ההתנהגות של ההרשאה לשימוש בעותקים כפולים ובערכים מרובים בכותרות HTTP. חשוב לדעת שאפשר להגדיר אותם רק במעבדי ההודעות באמצעות תחביר האסימון שמתואר במאמר איך מגדירים את 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, וגם
- הכותרות הספציפיות עם הגדרה קיימת
במכונה של Message Processor, מחפשים את הנכס
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
.
בקשה | MID יוצא על סמך ערך של 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=a test‑header=b |
protocol.http. |
test‑header=a test‑header=b |
protocol.http. |
test‑header=a test‑header=b |
לפני שמתחילים
לפני שמבצעים את השלבים במסמך הזה, חשוב להבין איך מגדירים מאפיינים ל-Edge בענן פרטי, כפי שמתואר במאמר איך מגדירים את Edge.
הגדרת allowDuplicates וערכים מרובים לכותרות
כפי שמוסבר בקטע מאפייני כותרות HTTP שמאפשרים כפילויות וערכים מרובים,הערך של המאפיין HTTPHeader.ANY = allowDuplicates,
multiValued
מרמז שכל הכותרות יכולות לכלול כפילויות וערכים מרובים ב-Apigee Edge. עם זאת, יש כותרות מסוימות שהערכים שלהן מוחלפים באופן מפורש כדי שלא יהיה אפשר להוסיף כותרות כפולות או כמה ערכים ל-thi באמצעות המאפיין 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
ב-Message Processor: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
מוגדר כרייק. כלומר, המאפיין נמחק כדי לא לאפשר ערכים כפולים או מרובים בכותרת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
בפועל.
- במכונה של Message Processor, מחפשים את המאפיין
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
הוגדרה בהצלחה במעבד ההודעות. - אם הערך הישן עדיין מופיע במאפיין
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
הפלט של הפקודה שלמעלה יגרום לאחת מהתוצאות הבאות:
- המאפיין מוגדר כריק, ואז הערך iמוחלף ב-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
. המשמעות היא שהמאפיין מוחלף כדי לאפשר ערכים כפולים או מרובים עבור הכותרתExpires
.פלט לדוגמה מס' 2
דוגמה לפקודה ולפלט מס' 2 של פקודה לחיפוש
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
בפלט לדוגמה לא מוצג פלט, כלומר המאפיין
HTTPHeader.myheader
מוגדר כברירת מחדל ל-allowDuplicates, multiValued
. המשמעות היא גם שהנכס לא מועלה מחדש בכותרת myheader. - המאפיין מוגדר כריק, ואז הערך iמוחלף ב-NOT כדי לאפשר כותרות כפולות וערכים מרובים. כלומר, אסור לשלוח את הכותרת
- אם תבחינו באחת מהאפשרויות הבאות, תצטרכו לבצע את שאר השלבים בקטע הזה:
- המאפיין התואם לכותרת הספציפית נמחק ומשויך מחדש כדי לאפשר כפילויות וערכים מרובים, כמו בפלט לדוגמה מס' 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
) עודכן.
במכונה של Message Processor, מחפשים את המאפיין
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_NAME
I במעבד ההודעות, הפקודה שלמעלה תציג את הערך החדש בקובץ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.