תיעוד 272
הגדרת CORS
שיתוף משאבים בין מקורות (CORS) הוא שיטה תקנית שמונעת מדומיין X לגשת למשאבים של דומיין Y. היא עושה זאת באמצעות כותרות מיוחדות בתגובות HTTP מדומיין Y, שמאפשרות לדפדפן לוודא שדומיין Y מתיר לדומיין X לגשת למשאבים האלה.
למרות ש-CORS יכול לעזור להגן על הנתונים מפני אתרים זדוניים, CORS משמש גם לאינטראקציה עם אובייקטים בדלי ולהגדרת מדיניות על הדלי.
CORS משמש כשאתם מקיימים אינטראקציה עם דלי מדפדפן אינטרנט, ויש לכם שתי אפשרויות:
הגדרת דלי כציבורי: אפשרות זו הופכת את הדלי לנגיש באינטרנט לקריאה בלבד, כלומר כל אחד יכול לבקש ולטעון אובייקטים מהדלי בדפדפן או בכל מקום אחר. אפשרות זו מתאימה אם הדלי מכיל תמונות שמשמשות בבלוג ציבורי.
כתובות URL חתומות מראש: מאפשרת לכל מי שיש לו גישה לכתובת ה-URL הייחודית לבצע פעולות מסוימות על הדלי.
#דרישות מוקדמות
לפני שאתם מגדירים CORS, חייבים להיות לכם:
- דלי R2 עם לפחות אובייקט אחד. אם אתם צריכים ליצור דלי, עיינו ביצירת דלי ציבורי.
- דומיין שאפשר להשתמש בו כדי לגשת לאובייקט. זה יכול להיות גם
localhost. - (אופציונלי) מפתחות גישה. מפתח גישה נדרש רק בעת יצירת כתובת URL חתומה מראש.
#שימוש ב-CORS עם דלי ציבורי
כדי להשתמש ב-CORS עם דלי ציבורי, ודאו שהדלי מוגדר לאפשר גישה ציבורית.
לאחר מכן, הוסיפו מדיניות CORS לדלי כדי לאפשר שיתוף של הקובץ.
#שימוש ב-CORS עם כתובת URL חתומה מראש
כתובות URL חתומות מראש מאפשרות גישה זמנית לביצוע פעולות מסוימות על הדלי בלי לחשוף את פרטי הגישה שלכם. למרות שכתובות URL חתומות מראש מטפלות באימות, עדיין צריך להגדיר CORS כשמבצעים בקשות מדפדפן.
כשדפדפן שולח בקשה לכתובת URL חתומה מראש במקור אחר, הדפדפן אוכף CORS. בלי מדיניות CORS, העלאות והורדות מבוססות דפדפן באמצעות כתובות URL חתומות מראש ייכשלו, גם אם כתובת ה-URL החתומה מראש עצמה תקינה.
כתובות URL חתומות מראש שפג תוקפן מחזירות תגובת 403 ExpiredRequest. R2 לא כולל כותרות תגובת CORS בתגובות של כתובות URL חתומות מראש שפג תוקפן, ולכן JavaScript בדפדפן לא יכול לקרוא את גוף השגיאה. רעננו כתובות URL חתומות מראש לפני שתוקפן פג, או ניתבו בקשות דרך שרת היישום אם הדפדפן צריך לטפל בשגיאות תפוגה ישירות.
כדי לאפשר גישה מבוססת דפדפן עם כתובות URL חתומות מראש:
- הוסיפו מדיניות CORS לדלי שמאפשרת בקשות מהמקור של היישום שלכם.
- הגדירו את
AllowedMethodsכך שיתאים לפעולות שכתובות ה-URL החתומות מראש מבצעות, השתמשו ב-GET,PUT,HEADו/אוDELETE. - הגדירו את
AllowedHeadersכך שיכלול כל כותרת שהלקוח ישלח בעת שימוש בכתובת ה-URL החתומה מראש, למשל כותרות לסוג תוכן, סכומי ביקורת, שמירה במטמון או מטא-נתונים מותאמים אישית. - (אופציונלי) הגדירו את
ExposeHeadersכדי לאפשר ל-JavaScript שלכם לקרוא כותרות תגובה כמוETag, שמכיל את הגיבוב של האובייקט ושימושי לאימות העלאות. - (אופציונלי) הגדירו את
MaxAgeSecondsכדי לשמור במטמון את תגובת הבקשה המקדימה ולהפחית את מספר בקשות הבקשה המקדימה שהדפדפן מבצע.
הדוגמה הבאה מאפשרת העלאות מבוססות דפדפן מ-https://example.com עם כותרת Content-Type:
[
{
"AllowedOrigins": ["https://example.com"],
"AllowedMethods": ["PUT"],
"AllowedHeaders": ["Content-Type"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]#שימוש ב-CORS עם דומיין מותאם אישית
דומיינים מותאמים אישית שמחוברים לדלי R2 עם מדיניות CORS מחזירים באופן אוטומטי כותרות תגובת CORS עבור בקשות בין מקורות.
בקשות בין מקורות חייבות לכלול כותרת בקשה Origin תקינה, לדוגמה Origin: https://example.com. אם אתם בודקים ישירות או משתמשים בכלי שורת פקודה כמו curl, לא תראו כותרות תגובה Access-Control-* של CORS אלא אם כותרת הבקשה Origin כלולה בבקשה.
שמירה במטמון וכותרות CORS
אם אתם מגדירים מדיניות CORS על דלי שכבר משרת תעבורה באמצעות דומיין מותאם אישית, נכסים קיימים שנשמרו במטמון לא ישקפו את כותרות תגובת CORS עד שהם יעודכנו במטמון. השתמשו בניקוי מטמון כדי לנקות את המטמון עבור שם המארח הזה אחרי כל שינוי שקשור למדיניות CORS.
#הוספת מדיניות CORS מלוח הבקרה
- בלוח הבקרה של Cloudflare, עברו לעמוד R2 object storage. מעבר אל Overview
- אתרו ובחרו את הדלי שלכם מהרשימה.
- בחרו Settings.
- תחת CORS Policy, בחרו Add CORS policy.
- מהלשונית JSON, הזינו ידנית או העתיקו והדביקו את המדיניות שלכם לתיבת הטקסט.
- כשסיימתם, בחרו Save.
המדיניות שלכם מוצגת בעמוד Settings של הדלי.
#הוספת מדיניות CORS באמצעות Wrangler CLI
אפשר להגדיר כללי CORS באמצעות Wrangler CLI.
- צרו קובץ JSON עם הגדרת ה-CORS שלכם:
cors.json
{
"rules": [
{
"allowed": {
"origins": ["https://example.com"],
"methods": ["GET"]
}
}
]
}- החילו את מדיניות ה-CORS על הדלי:
npx wrangler r2 bucket cors set <BUCKET_NAME> --file cors.json- אמתו שמדיניות ה-CORS הוחלה:
npx wrangler r2 bucket cors list <BUCKET_NAME>#כותרות תגובה
השדות הבאים במדיניות CORS של R2 ממופים לכותרות תגובת HTTP. כותרות התגובה האלה מוחזרות רק כשבקשת ה-HTTP הנכנסת היא בקשת CORS תקינה.
| שם שדה | תיאור | דוגמה |
|---|---|---|
AllowedOrigins | מציין את הערך לכותרת Access-Control-Allow-Origin ש-R2 מגדיר בעת בקשת אובייקטים בדלי מדפדפן. | אם אתר ב-www.test.com צריך לגשת למשאבים (למשל גופנים, סקריפטים) בדומיין מותאם אישית של static.example.com, תגדירו את https://www.test.com בתור AllowedOrigin. |
AllowedMethods | מציין את הערך לכותרת Access-Control-Allow-Methods ש-R2 מגדיר בעת בקשת אובייקטים בדלי מדפדפן. | GET, POST, PUT |
AllowedHeaders | מציין את הערך לכותרת Access-Control-Allow-Headers ש-R2 מגדיר בעת בקשת אובייקטים בדלי הזה מדפדפן. בקשות בין מקורות שכוללות כותרות מותאמות אישית (למשל x-user-id) צריכות לציין את הכותרות האלה בתור AllowedHeaders. | x-requested-by, User-Agent |
ExposeHeaders | מציין את הכותרות שאפשר לחשוף בחזרה, וש-JavaScript שמבצע את הבקשה בין המקורות יכול לגשת אליהן. אם אתם צריכים לגשת לכותרות מעבר לכותרות התגובה שברשימה הבטוחה, כמו Content-Encoding או cf-cache-status, עליכם לציין אותן כאן. | Content-Encoding, cf-cache-status, Date |
MaxAgeSeconds | מציין את משך הזמן (בשניות) שדפדפנים רשאים לשמור במטמון תגובות בקשה מקדימה של CORS. דפדפנים עשויים להגביל זאת לשעתיים או פחות, גם אם הערך המרבי (86400) צוין. | 3600 |
#דוגמה
דוגמה זו מציגה מדיניות CORS שנוספה לדלי שמכיל את האובייקט Roboto-Light.ttf, שהוא קובץ גופן.
AllowedOrigins מציין את שרת האינטרנט שבשימוש, ו-localhost:3000 הוא שם המארח שבו שרת האינטרנט פועל. AllowedMethods מציין שרק בקשות GET מותרות ויכולות לקרוא אובייקטים בדלי שלכם.
[
{
"AllowedOrigins": ["http://localhost:3000"],
"AllowedMethods": ["GET"]
}
]באופן כללי, אסטרטגיה טובה לוודא שהגדרתם את כללי ה-CORS הנכונים היא להסתכל על בקשת הרשת שהדפדפן חוסם.
- ודאו ש-
AllowedOriginsשל הכלל כולל את המקור שממנו הבקשה נשלחת. (כמוhttp://localhost:3000אוhttps://yourdomain.com) - ודאו ש-
AllowedMethodsשל הכלל כולל את השיטה של הבקשה החסומה. - ודאו ש-
AllowedHeadersשל הכלל כולל את הכותרות של הבקשה החסומה.
שימו לב גם שהפצת כללי CORS יכולה, במקרים נדירים, להימשך עד 30 שניות.
#בעיות נפוצות
- רק בקשה בין מקורות כוללת כותרות תגובת CORS. R2 מזהה בקשות אלה לפי כותרת בקשת HTTP בשם
Origin. ערך הכותרת חייב להתאים למקור בשדהAllowedOriginsשל המדיניות שלכם. בקשות בלי כותרתOriginלא מחזירות כותרות תגובת CORS. - הערכים של
AllowedOriginsבמדיניות ה-CORS שלכם חייבים להיות*או תבנית תקינה שמבוססת על ערך כותרת HTTP Origin. כותרתOriginתקינה לא כוללת רכיב נתיב, והיא חייבת להכיל רקscheme://host[:port](כאשר הפורט אופציונלי).- השתמשו ב-
*כדי לאפשר בקשות מכל מקור. - תבנית מקור יכולה להכיל לכל היותר תו כללי
*אחד. התו הכללי יכול לחצות נקודות. לדוגמה,https://*.example.comתואם גם ל-https://api.example.comוגם ל-https://a.b.example.com, אבל לא ל-https://example.com. - ערכי מקור בלי תו כללי חייבים להתאים בדיוק לכותרת
Originשל הבקשה. - פורטים לא יכולים להכיל תווים כלליים. כדי לאפשר כמה פורטים של localhost, ציינו כל מקור בנפרד, למשל
http://localhost:3000ו-http://localhost:5173. - ערך
AllowedOriginsתקין:https://static.example.com. כולל את הסכמה ואת המארח. פורט הוא אופציונלי ומשתמע מהסכמה. - ערך
AllowedOriginsלא תקין:https://static.example.com/אוhttps://static.example.com/fonts/Calibri.woff2. כולל בטעות את רכיב הנתיב.
- השתמשו ב-
- אם אתם צריכים לגשת לערכי כותרות מסוימים באמצעות JavaScript בעמוד המקור, למשל כשמשתמשים בנגן וידאו, ודאו שהגדרתם את
Access-Control-Expose-Headersנכון וכללו את הכותרות ש-JavaScript שלכם צריך לגשת אליהן, כמוContent-Length.