RewriteEngine On # If the request is not for a real file or directory RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Redirect all requests to index.php RewriteRule ^(.*)$ index.php [QSA,L] # Prevent directory listing Options -Indexes # Set default charset AddDefaultCharset UTF-8 # ===== 安全加固 ===== # 禁止访问敏感文件 Order allow,deny Deny from all # 禁止直接访问诊断/调试/安装/修复脚本 Order allow,deny Deny from all # 禁止访问备份目录(含 backups/ 和 _backup_/) RewriteRule ^backups/ - [F,L] RewriteRule ^_backup_ - [F,L] # 安全头 Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy "strict-origin-when-cross-origin" # P2-6 / v3-P2:CSP 已迁移至 index.php 按请求动态生成(含 nonce),此处不再静态设置, # 以避免与 PHP 端的 nonce 策略形成「双重 CSP 策略」冲突(浏览器会要求两者同时满足)。 # 当前 script-src 仍保留 'unsafe-inline' 作为迁移过渡;待全站内联事件处理器 #(onclick 等)改造为 addEventListener 后,再于 index.php 移除 'unsafe-inline'。 Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # 仅 HTTPS 时启用 HSTS(站点已 301 强制 HTTPS,可安全启用) Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"