問題の説明
クロスオリジンアクセスを有効にし、オリジン間のデータ転送のセキュリティを確保するには、Object Storage Service (OSS) コンソールでクロスオリジンリソース共有 (CORS) ルールを設定します。 ただし、OSS SDKを使用してプログラムを呼び出すと、次のエラーが報告されます。
要求されたリソースに「Access-Control-Allow-Origin」ヘッダーが存在しません
原因
次のセクションでは、考えられる原因について説明します。
CORSルールの設定が正しくありません。
ブラウザのキャッシュは読み取られますが、キャッシュにはCORSルールで指定されたレスポンスヘッダーが含まれていません。
解決策
ブラウザのキャッシュをクリアします。 次に、クロスオリジンリクエストを開始して、エラーが続くかどうかを確認します。 エラーが解決しない場合は、次の手順を実行して、CORSルールが正しく設定されているかどうかを確認します。
左側のナビゲーションツリーで、[コンテンツセキュリティ] > [CORS] を選択します。
CORSページで、[ルールの作成] をクリックします。
では、ルールの作成パネル、セットソースへ
*
のすべてのオプションを選択します。許可メソッド、セットヘッダーを許可するへ*
,露出ヘッダーへETagとx-oss-request-id、およびキャッシュのタイムアウト (秒)へ0、選択Vary: 起源をクリックし、OK. 詳細については、「CORSの設定」をご参照ください。説明[Vary: Origin]
を選択すると、ローカルキャッシュエラーは防止されますが、ブラウザからのリクエストまたはCDN back-to-originリクエストの数が増加する可能性があります。上記の手順を実行してもエラーが発生しない場合は、サーバーにログインして次のコマンドを実行し、クロスオリジンリクエストヘッダーを表示します。
curl -voa '[$URL1]' -H 'Origin:[$URL2]'
説明[$URL1] は、要求されるOSSオブジェクトのURLです。
[$URL2] は、設定したソースの値です。
次の図は、サンプル出力を示しています。
出力にCORSルールの設定と一致するCORSヘッダーが含まれている場合、キャッシュが原因でエラーが発生する可能性があります。 これは、最初のリクエストがクロスオリジンリクエストではなく、返されたデータがローカルにキャッシュされていることを示します。 次に、クロスオリジンアクセスをトリガーする2番目のリクエストは、ローカルキャッシュから直接データを取得します。 この場合、クロスオリジン検証は失敗します。 この問題を解決するには、次のいずれかの方法を使用します。
ブラウザページで、[Ctrl] + [F5] をクリックしてブラウザのキャッシュをクリアします。 次に、クロスオリジンリクエストを開始して、エラーが続くかどうかを確認します。
CORSルールのキャッシュタイムアウト (秒) を0に設定します。 これにより、リソースがクライアントでキャッシュされなくなります。 このようにして、認証情報は、各要求についてサーバから取得される。
説明ファイルをOSSにアップロードするときは、ファイルのcache-controlをno-cacheに設定します。 すでにアップロードされているファイルについては、ossutilを使用して設定を変更できます。 cache-controlの設定方法については、 set-meta (オブジェクトメタデータの管理) 。
Alibaba Cloud CDNを使用してOSSへのアクセスを高速化します。 このようにして、要求ごとにCORSヘッダーが返されます。
出力に2つのCORSヘッダーが含まれている場合、またはCORSヘッダーがCORSルールで設定したヘッダーに含まれていない場合、エラーはAlibaba Cloud CDNの使用が原因である可能性があります。 この場合、次の手順を実行します。
Alibaba Cloud CDNコンソールにログインし、OSSのCDNを一時的に無効にします。 次に、クロスオリジンリクエストを開始して、エラーが続くかどうかを確認します。
管理するドメイン名をクリックし、[キャッシュ] > [POP HTTPレスポンスヘッダー] を選択します。
ビジネス要件に基づいてカスタムHTTPレスポンスヘッダーを指定します。
前述のすべての操作を実行してもエラーが発生しない場合は、トラブルシューティングについて「OSS CORS」をご参照ください。