# ============================================================
#  SƠN LINH — Bảo vệ thư mục Trang Quản Trị
#  Chặn tải trực tiếp các file nhật ký/cache/cấu hình nhạy cảm.
#  (PHP vẫn chạy bình thường; manifest.json vẫn mở cho PWA.)
# ============================================================

# Không liệt kê thư mục (Thường gây lỗi 500 trên một số hosting, nên có thể cẩn thận khi dùng)
# Options -Indexes

# Chặn nhật ký & file dữ liệu thô (error_log.txt, *.log, *.sql, backup, *.lock)
<FilesMatch "\.(txt|log|sql|bak|old|ini|lock)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order deny,allow
        Deny from all
    </IfModule>
</FilesMatch>

# Chặn đích danh các JSON nội bộ (KHÔNG chặn manifest.json — PWA cần)
<FilesMatch "^(settings|cws_cache)\.json$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order deny,allow
        Deny from all
    </IfModule>
</FilesMatch>

# Chặn harness preview nội bộ (chỉ dùng dev cục bộ, KHÔNG deploy)
<FilesMatch "^_preview\.html$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order deny,allow
        Deny from all
    </IfModule>
</FilesMatch>

# Header bảo mật cơ bản (nếu mod_headers có sẵn)
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "DENY"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"

    # Chỉ ép HTTPS (site chạy HTTPS). 180 ngày.
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"

    # Tắt các API trình duyệt không dùng
    Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()"

    # CSP ở chế độ REPORT-ONLY: KHÔNG chặn gì, chỉ ghi vi phạm ra Console để theo dõi.
    # Đã liệt kê đúng CDN đang dùng (Font Awesome cdnjs + Google Fonts). 'unsafe-inline'
    # cần cho các onclick=/style= nội tuyến hiện có. Khi Console không còn báo vi phạm,
    # đổi "Content-Security-Policy-Report-Only" -> "Content-Security-Policy" để BẬT chặn thật.
    Header always set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com data:; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; object-src 'none'; form-action 'self'"
</IfModule>
