発生事象
さくらのCDN(ウェブアクセラレータ)+オブジェクトストレージでHTTPS配信すると、サイトを開いた際にダウンロードとなってサイトがブラウザで開けない
原因
index.htmlのcontent_typeがoctet-streamで配信されているから。
-> さくらのオブジェクトストレージで2024年7月現在Webからアップロードすると、すべてcontent_typeがoctet-streamで登録される。
-> boto3 使って適切にmime/typeを設定してアップロードする必要がある。
対策 boto3で適切にmime/typeを設定してアップロードする
まずチェックする
import boto3
# クライアントの設定
client = boto3.client(
's3',
endpoint_url="https://s3.isk01.sakurastorage.jp",
aws_access_key_id='*****',
aws_secret_access_key='*****',
region_name='jp-north-1' # リージョンに合わせて修正
)
# バケット名とオブジェクトキーを設定
bucket_name = '*****'
object_key = 'index.html'
# メタデータの取得
response = client.head_object(Bucket=bucket_name, Key=object_key)
# Content-Typeの表示
print(response)
boto3でMimeType設定してアップロードする
import boto3
import os
import mimetypes
# クライアントの設定
client = boto3.client(
's3',
endpoint_url="https://s3.isk01.sakurastorage.jp",
aws_access_key_id='*****',
aws_secret_access_key='*****',
region_name='jp-north-1' # リージョンに合わせて修正
)
# バケット名とオブジェクトキーを設定
bucket_name = '*****'
directory_path = '../*****/'
# ディレクトリ内の全ファイルをリストアップし、アップロード
for subdir, dirs, files in os.walk(directory_path):
for file in files:
if file == '.DS_Store':
continue # .DS_Store ファイルはスキップする
full_path = os.path.join(subdir, file)
with open(full_path, 'rb') as data:
mime_type, _ = mimetypes.guess_type(full_path)
if mime_type is None:
mime_type = 'application/octet-stream' # デフォルトの MIME タイプ
client.put_object(
Bucket=bucket_name,
Key=os.path.relpath(full_path, directory_path),
Body=data,
ContentType=mime_type
)
print(f'Uploaded {file} with MIME type {mime_type}')