前後端分離架構下,瀏覽器同源策略阻攔跨域 AJAX 請求。Apache 透過 mod_headers 注入 CORS 標頭,可靈活控制允許來源、方法、標頭與憑證。本文針對 HTTPS API 場景,提供生產級配置模板與預檢請求 (Preflight) 處理細節。
# httpd.conf
LoadModule headers_module modules/mod_headers.so
<VirtualHost *:443>
ServerName api.example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
# === CORS 核心標頭 ===
# 1. 允許來源 (生產建議指定具體域名,避免 *)
Header always set Access-Control-Allow-Origin "https://app.example.com"
# 2. 允許方法
Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE"
# 3. 允許自定義標頭 (關鍵:Content-Type, Authorization 等)
Header always set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
# 4. 允許攜帶憑證
Header always set Access-Control-Allow-Credentials "true"
# 5. 預檢請求快取時間 (減少 OPTIONS 請求)
Header always set Access-Control-Max-Age "86400"
# === 處理 OPTIONS 預檢請求 (204 No Content 直接返回) ===
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=204,L]
</IfModule>
</VirtualHost>
| 標頭 | 必要性 | 說明 |
|---|---|---|
| Access-Control-Allow-Origin | 必填 | 值為 * 或單一域名。若 Allow-Credentials=true,不能用 *,必須動態回傳請求 Origin (需配合 SetEnvIf Origin + Header set 條件注入)。 |
| Access-Control-Allow-Methods | 必填 | 列出實際支援方法,預檢請求會驗證。 |
| Access-Control-Allow-Headers | 必填 | 極關鍵:前端發送 Content-Type: application/json 會觸發預檢,請求標頭含 Access-Control-Request-Headers: Content-Type,若此處缺少 Content-Type 導致預檢失敗 (403)。 |
| Access-Control-Allow-Credentials | 可選 | 允許 Cookie/Authorization 標頭跨域攜帶。前端 xhr.withCredentials = true 時必須為 true。 |
| Access-Control-Max-Age | 建議 | 預檢結果快取秒數,預設 5 秒,建議 86400 (1 天) 減少 OPTIONS 流量。 |
<IfModule mod_setenvif.c>
SetEnvIf Origin "^https?://(app\.example\.com|admin\.example\.com)$" ACCESS_CONTROL_ORIGIN=$0
</IfModule>
Header always set Access-Control-Allow-Origin "%{ACCESS_CONTROL_ORIGIN}e" env=ACCESS_CONTROL_ORIGIN
Header always set Access-Control-Allow-Credentials "true" env=ACCESS_CONTROL_ORIGIN
apachectl -t && systemctl reload httpdHeader always set Access-Control-Allow-Origin "https://*.example.com" (需瀏覽器支援),否則仍需動態回傳。參考規範:W3C CORS Spec。生產環境務必限制 Origin 白名單,避免 * 洩露內部 API。