Balbas Code

.htaccessでAPIとブラウザのアクセス設定を分ける(初心者向け)

公開日: 2025-09-04 15:19:43

目的(この記事でできること)




  • /api/(=アプリが呼ぶAPI)だけは www. 付きURLもそのまま通す




  • それ以外のページは 非www(例:https://example.com)+https




 


まず:「.htaccess」って何?




  • Apache サーバーで使う「そのフォルダ専用の設定ファイル」です。




  • ファイル名は .htaccess(先頭がドット)。サイトの公開フォルダ直下に置きます。




  • 中のルールは 上から順番に評価され、[L] が付くとそこで処理が止まります。




  • 今回は URLのリダイレクトをするために mod_rewrite を使います(最初に RewriteEngine On が必要)。





※ レンタルサーバーによっては .htaccess が使えない設定のこともあります。
その場合は「mod_rewrite」「AllowOverride」の可否をマニュアルで確認してください。





コピペOK:完成版 .htaccess テンプレ



置き場所:公開フォルダ直下(例:/public_html/.htaccess
使い方:example.com をあなたのドメインに、^/api/ をあなたのAPIの先頭パスに置き換えてください。



 


# 1) リライトを有効にする
RewriteEngine On

# 2) 【APIだけ特別扱い】wwwを許可しつつ、httpならhttpsへ(ホスト名はそのまま維持)
# 例:/api/ 以下がアプリのAPI
RewriteCond %{REQUEST_URI} ^/api/ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING} [R=308,L]

# 3) 【APIだけ特別扱い】すでにhttpsならここで終了(www→非wwwの正規化はしない)
RewriteCond %{REQUEST_URI} ^/api/ [NC]
RewriteRule ^ - [L]

# 4) 【サイト全体の正規化】API以外は「非www + https」にまとめる(メソッド保持のため 308)
RewriteCond %{REQUEST_URI} !^/api/ [NC]
RewriteCond %{HTTP_HOST} !^example\.com$ [OR]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://example.com%{REQUEST_URI}?%{QUERY_STRING} [R=308,L]

 


ポイントだけ覚える




  • API (/api/)




    • http://www.example.com/api/...https へ(www は維持)




    • https://www.example.com/api/...そのまま通す(www を許可)






  • それ以外のURL





 


動作テスト(かんたん版)


1) API用の test.php を作る


公開フォルダの /api/test.php を置き、下記を保存:


<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "OK: " . ($_SERVER['HTTP_HOST'] ?? '') . " " . ($_SERVER['REQUEST_URI'] ?? '');

 


2) ブラウザで確認(※ example.com はあなたのドメインに)




  • https://www.example.com/api/test.php
    そのまま表示されればOK(www 許可)




  • http://www.example.com/api/test.php
    https に変わって表示されればOK(www 維持)




  • https://www.example.com/
    https://example.com/




Macの場合はターミナルで下記の値で実行確認できます。


curl -I https://www.example.com/api/test.php
curl -I http://www.example.com/api/test.php
curl -I https://www.example.com/

 


よくある質問


Q. APIのパスが /api/ じゃないのですが?
A. 2) と 3) の ^/api/あなたのAPIの先頭パス(例:^/v1/^/service/ など)に変えてください。
APIが複数あるなら、この2ブロックを必要数コピペして増やすだけでOKです。


Q. 308って初めて聞きました。301じゃダメ?
A. 308 Permanent Redirectメソッドとボディを保持します。
API で POST/PUT を安全に扱うため、301/302より 308 を推奨します。


Q. .htaccess が効いていない気がします
A. サーバーが Apache で、mod_rewrite が有効、かつ AllowOverride が許可されている必要があります。
レンタルサーバーのマニュアルで「.htaccess」「mod_rewrite」を確認してください。


Q. CDN(Cloudflare等)を使っています
A. CDN側でもリダイレクト設定があると、どちらが先に効くかで挙動が変わります。
基本は 片側に集約して管理しましょう(CDNでやるなら .htaccess 側は最小に)。


 


今回こちらが必要になった背景は、サーバーの構造を変更した際に.htaccessファイルの設定を追加したところ、元々あったアプリケーションからサーバーにアクセスできないという自体が発生しました。
こちらはAppleStoreにリリースしているアプリの為、URLを書き換えてしまうと再審査と全てのアプリにアップデートを行う必要があったのでできるだけ避けたいなと思い調べたところ、アプリAPIとブラウザアクセスを変える設定ができました。
迂闊に.htaccessをいじってしまうとこのようなことになるので、とても勉強になりました。