2026年7月10日

2026年7月10日

ApacheでContent-Typeとcharsetを設定

はじめに

ブラウザに表示した日本語ページが「縺ゅ>縺・◎縺・」のように文字化けする現象は、ほぼ100% Webサーバーが返すレスポンスヘッダの Content-Type と HTMLメタタグ・実ファイルのエンコーディングが食い違っていることが原因です。Apacheには AddTypeAddDefaultCharsetAddCharset など複数の指令があり、どれを使うべきか迷いやすいポイントでもあります。

本記事では、ApacheでContent-TypeとcharsetをHTTPヘッダで明示する設定方法を、グローバル設定・拡張子別・.htaccess レベルでそれぞれ紹介します。また mod_mimemod_headers の役割の違いや、UTF-8環境での推奨設定もまとめます。

レンダリングモードに影響する meta タグとHTTPヘッダの優先順位も整理するので、表示が改善しない場合の原因切り分けにも役立ちます。

症状・背景

  • 日本語ページが文字化けする
  • ファイルはUTF-8で保存しているのにブラウザがShift_JISと判定する
  • JSONを返してもブラウザがtext/htmlとして表示する
  • CSSやJSが text/plain で配信され適用されない

手順・設定方法

ステップ1: 現在のContent-Typeを確認

まずどんなヘッダが返っているか確認します。

# レスポンスヘッダを確認
curl -I https://example.com/

# 詳細を見る場合
curl -sv https://example.com/ 2>&1 | grep -i content-type

# ファイル自身の文字コードを確認
file -i /var/www/html/index.html

# nkfで実際のエンコーディングを判定
nkf -g /var/www/html/index.html

ステップ2: グローバルにデフォルトcharsetを設定

全レスポンスにUTF-8を付与します。

# /etc/apache2/conf-available/charset.conf を作成
sudo tee /etc/apache2/conf-available/charset.conf > /dev/null <<'EOF'
AddDefaultCharset UTF-8
EOF

# 有効化
sudo a2enconf charset

# RHEL系では /etc/httpd/conf.d/charset.conf に直接書く
# AddDefaultCharset UTF-8

# 構文確認 → 反映
sudo apache2ctl configtest
sudo systemctl reload apache2

ステップ3: 拡張子別のContent-Type設定

ファイル種別ごとに正しいMIMEタイプを返します。

# /etc/apache2/mods-available/mime.conf に追記
sudo tee -a /etc/apache2/mods-available/mime.conf > /dev/null <<'EOF'
AddType application/json .json
AddType application/javascript .js
AddType text/css .css
AddType image/svg+xml .svg
AddCharset UTF-8 .html .htm .css .js .json
EOF

# 反映
sudo systemctl reload apache2

# 動作確認
curl -I https://example.com/api/data.json

ステップ4: .htaccessやmod_headersで個別上書き

ディレクトリ単位・ファイル単位で細かく設定します。

# .htaccess でディレクトリ単位の指定
sudo tee /var/www/html/api/.htaccess > /dev/null <<'EOF'
<IfModule mod_headers.c>
  Header set Content-Type "application/json; charset=UTF-8"
</IfModule>
EOF

# mod_headersの有効化
sudo a2enmod headers

# 特定ファイルだけ上書きする場合
# <FilesMatch "\.json$">
#   ForceType application/json
#   Header set Content-Type "application/json; charset=UTF-8"
# </FilesMatch>

sudo systemctl reload apache2

注意事項

  • HTTPヘッダの Content-Type はHTMLの よりも優先されるため、ヘッダが間違っているとmetaタグでは矯正できません
  • AddDefaultCharset を設定すると全てのテキスト応答にcharsetが付くため、すでに正しいcharsetを送っているCGIの応答を上書きしてしまう場合があります
  • ForceType は拡張子に関係なく強制的にMIMEタイプを上書きするため、誤用するとダウンロードリンクが効かなくなることがあります
  • ファイル本体が実際にUTF-8で保存されていないと、ヘッダだけ変えても文字化けは解消しません

まとめ

1. まずヘッダ確認: curl -I でContent-Typeが何になっているか把握

2. デフォルトはUTF-8: AddDefaultCharset UTF-8 をグローバル設定する

3. MIMEタイプ追加: AddType でjson/svg等の正しいMIMEを設定

4. 個別上書き: .htaccess + mod_headers でディレクトリ単位の調整

5. ファイル本体も確認: file -i でエンコーディングが本当にUTF-8か検証

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ