首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Apache .htaccess 深度解析:目錄級配置、效能與安全最佳實踐

     編輯:PHP 相關知識

.htaccess 核心定位

.htaccess (分散式配置檔) 允許在特定目錄覆蓋 Apache 主配置,作用於該目錄及所有子目錄。適用於無 root 權限的虛擬主機環境、需要動態調整規則的場景。

運作原理與效能代價

  1. Apache 每次請求遞迴檢查:/.htaccess → /var/www/.htaccess → /var/www/site/.htaccess → /var/www/site/app/.htaccess
  2. 每個目錄檢查一次檔案系統 stat(),即使檔案不存在
  3. AllowOverride All 啟用時效能影響最大
  4. 最佳實踐:主配置 <Directory> 可直接設定的規則,不要 放在 .htaccess

核心指令分類速查

類別常用指令AllowOverride 需求
URL 重寫RewriteEngine, RewriteRule, RewriteCond, RewriteBaseFileInfo
存取控制Require, Allow, Deny, Order (2.4 棄用)AuthConfig / Limit
認證授權AuthType, AuthName, AuthUserFile, AuthGroupFileAuthConfig
MIME 類型AddType, AddHandler, ForceTypeFileInfo
目錄索引DirectoryIndex, Options +IndexesIndexes
CGI/腳本Options +ExecCGI, AddHandler cgi-script, SetHandlerOptions / FileInfo
PHP 設定php_value, php_flag, php_admin_valueOptions (需 mod_php)
快取控制ExpiresActive, ExpiresByType, Header set Cache-ControlFileInfo
壓縮傳輸SetOutputFilter DEFLATE, AddOutputFilterByTypeFileInfo
安全標頭Header set X-Frame-Options, Header set CSPFileInfo

常見實戰配置範例

1. Laravel/CodeIgniter/Symfony 前端控制器模式

# .htaccess (專案根目錄)
RewriteEngine On

# 靜態檔案直接服務
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# 其餘導向 index.php
RewriteRule ^ index.php [L,QSA]

# 保護敏感檔案
RewriteRule ^\.env$ - [F,L]
RewriteRule ^composer\.(json|lock)$ - [F,L]
RewriteRule ^storage/ - [F,L]
RewriteRule ^vendor/ - [F,L]

2. 強制 HTTPS + WWW 統一

RewriteEngine On

# 強制 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# 統一 WWW (二選一)
# 方案 A: 強制 www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# 方案 B: 移除 www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [L,R=301]

3. GZIP 壓縮 + 瀏覽器快取

# 啟用壓縮 (需 mod_deflate)

    AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript application/json application/xml
    
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    


# 瀏覽器快取 (需 mod_expires)

    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresDefault "access plus 2 days"

4. 安全性增強標頭


    # 防點擊劫持
    Header always set X-Frame-Options "SAMEORIGIN"
    # XSS 保護
    Header always set X-XSS-Protection "1; mode=block"
    # 禁止 MIME 嗅探
    Header always set X-Content-Type-Options "nosniff"
    # 內容安全政策 (CSP) - 根據專案調整
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' fonts.gstatic.com;"
    # Referrer 政策
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    # HSTS (僅 HTTPS 環境)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

5. PHP 設定覆蓋 (僅 mod_php / php-fpm with AllowOverride Options)

# 上傳限制
php_value upload_max_filesize 50M
php_value post_max_size 60M
php_value max_execution_time 300
php_value max_input_time 300

# 錯誤顯示 (開發環境)
php_flag display_errors On
php_value error_reporting 32767

# Session 設定
php_value session.gc_maxlifetime 7200
php_value session.cookie_httponly 1
php_value session.cookie_secure 1
php_value session.use_strict_mode 1

指令繼承與覆蓋規則

# /var/www/.htaccess
Options +ExecCGI

# /var/www/subdir/.htaccess
Options +Includes
# 結果: subdir 只有 Includes,ExecCGI 被覆蓋 (非累加)

# 正確累加寫法:
Options +ExecCGI +Includes
# 或
Options +ExecCGI
Options +Includes

疑難排解清單

  1. 規則不生效:檢查 AllowOverride 是否包含所需類別 (預設 None)
  2. 500 Internal Server Error:語法錯誤、指令不被允許、模組未載入 → 查看 Apache error.log
  3. 重寫循環:RewriteRule 導向自身 → 加入 RewriteCond %{REQUEST_FILENAME} !-f 排除實體檔案
  4. 效能問題:大量 .htaccess → 移至主配置 <Directory>
  5. PHP 設定不生效:僅 mod_php 支援 php_value,PHP-FPM 需用 .user.ini 或池配置

現代替代方案:主配置集中化

# httpd.conf / apache2.conf

    # 將 .htaccess 規則移至此處
    AllowOverride None  # 完全禁用 .htaccess,提升效能
    
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [L]
    
    # 安全標頭、壓縮、快取等同樣設定
    Header always set X-Frame-Options "SAMEORIGIN"
    # ...

總結:何時使用 .htaccess

  • ✅ 共享主機、無 root 權限
  • ✅ 開發環境快速測試規則
  • ✅ 應用層級動態規則 (如 CMS 產生的重寫規則)
  • ❌ 生產環境高流量網站 (效能代價大)
  • ❌ 全域性安全策略 (應在主配置統一管理)
  • ❌ PHP-FPM 環境的 PHP 設定 (改用 .user.ini)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved