2026年7月10日
2026年7月10日
ApacheでContent-Typeとcharsetを設定
はじめに
ブラウザに表示した日本語ページが「縺ゅ>縺・◎縺・」のように文字化けする現象は、ほぼ100% Webサーバーが返すレスポンスヘッダの Content-Type と HTMLメタタグ・実ファイルのエンコーディングが食い違っていることが原因です。Apacheには AddType・AddDefaultCharset・AddCharset など複数の指令があり、どれを使うべきか迷いやすいポイントでもあります。
本記事では、ApacheでContent-TypeとcharsetをHTTPヘッダで明示する設定方法を、グローバル設定・拡張子別・.htaccess レベルでそれぞれ紹介します。また mod_mime と mod_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か検証
関連記事: