# Shirakaba CMS 管理アプリ（配布版 cms/ 直下。CONTRACTS §19.1）
# - ファイルが無いパスは index.php へ（mod_rewrite が無い環境では index.php/manage/... 形式で動作）
# - app/ storage/ 隠しファイル（.env 等）は Web から読ませない
# - PHP の実行は index.php と cron.php のみ
# - 公開サイト用のヘッダ（CSP 等）は公開ディレクトリの .htaccess 側で cms/ を除外して付ける（ここで unset すると
#   PHP-FPM 経由の応答では管理画面の CSP まで消えるため、打ち消しは行わない）

Options -Indexes
DirectoryIndex index.php
ServerSignature Off

<FilesMatch "^\.">
  Require all denied
</FilesMatch>
<FilesMatch "\.(php[0-9]?|phtml|phar|inc|sqlite|log|lock|json|md|sh|dist)$">
  Require all denied
</FilesMatch>
<FilesMatch "^(index|cron)\.php$">
  Require all granted
</FilesMatch>

<IfModule mod_rewrite.c>
  RewriteEngine On
  # インストーラーの環境チェックで mod_rewrite の有無を判定するための目印
  RewriteRule ^ - [E=CMS_REWRITE:1]
  # --- HTTPS を強制する場合（.env の FORCE_HTTPS=true でも PHP 側でリダイレクトされます）---
  # RewriteCond %{HTTPS} off
  # RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
  # RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
  RewriteRule ^(app|storage)(/|$) - [R=404,L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
  <IfModule mod_alias.c>
    RedirectMatch 404 /(app|storage)(/|$)
  </IfModule>
</IfModule>

# 静的ファイル（admin-assets）にだけ付ける（PHP の応答は PHP 側で付けるため二重にしない）
<IfModule mod_headers.c>
  <FilesMatch "\.(css|js|svg|png|ico|woff2)$">
    Header set X-Content-Type-Options "nosniff"
  </FilesMatch>
  # PHP のバージョンを知らせない（php.ini の expose_php=Off が使えない共用サーバー向け）
  Header always unset X-Powered-By
  Header unset X-Powered-By
</IfModule>

# --- 管理画面を IP 制限・Basic 認証で守る場合 ---
# 上の <FilesMatch "^(index|cron)\.php$"> の「Require all granted」が後勝ちで効くため、ディレクトリ直下に
# Require を書いても index.php には効きません。上のブロックを次の 2 つに置き換えてください。
# （IP 制限だけなら .env の ADMIN_ALLOW_IPS=203.0.113.10,198.51.100.0/24 でも同じことができます）
#
# <FilesMatch "^index\.php$">
#   # IP 制限の例
#   Require ip 203.0.113.10 198.51.100.0/24
#   # Basic 認証の例（.htpasswd は公開ディレクトリの外に置く。作成: htpasswd -c /home/USER/.htpasswd-cms admin）
#   # AuthType Basic
#   # AuthName "Restricted"
#   # AuthUserFile /home/USER/.htpasswd-cms
#   # Require valid-user
# </FilesMatch>
# <FilesMatch "^cron\.php$">
#   # Web cron はキーで保護されているので、外部の cron サービスから叩く場合は許可のままにする
#   Require all granted
# </FilesMatch>
