Symfony2 採用前端控制器模式,所有請求均進入 web/app.php(生產環境)或 web/app_dev.php(開發環境)。Nginx 需正確配置 rewrite 與 fastcgi,確保僅允許這兩個入口檔以 PHP 腳本執行,其餘 PHP 檔案應被拒絕或下載,防止惡意執行。
server {
listen 80;
server_name example.com; # 請替換為您的域名
root /var/www/symfony2/web; # 指向 Symfony 專案的 web 目錄
error_log /var/log/nginx/symfony2.error.log;
access_log /var/log/nginx/symfony2.access.log;
# 將帶 app.php 的 URL 重寫為乾淨的靜態風格
rewrite ^/app\.php/?(.*)$ /$1 permanent;
location / {
index app.php;
try_files $uri @rewriteapp; # 靜態檔直接服務,其餘交給 @rewriteapp
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
# 僅允許 app.php 與 app_dev.php 進入 FastCGI
location ~ ^/(app|app_dev)\.php(/|$) {
fastcgi_pass 127.0.0.1:9000; # PHP-FPM 監聽地址
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off; # 標識非 HTTPS
}
# 額外安全:禁止存取 web/ 目錄下其他 .php 檔
location ~ \.php$ {
return 404;
}
}
server {
listen 443 ssl;
server_name example.com;
root /var/www/symfony2/web;
ssl_certificate /etc/ssl/certs/symfony2.crt;
ssl_certificate_key /etc/ssl/private/symfony2.key;
error_log /var/log/nginx/symfony2.error.log;
access_log /var/log/nginx/symfony2.access.log;
rewrite ^/app\.php/?(.*)$ /$1 permanent;
location / {
index app.php;
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(app|app_dev)\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on; # 關鍵:告知 Symfony 當前為 HTTPS
}
location ~ \.php$ {
return 404;
}
}
| 指令/區塊 | 作用 |
|---|---|
try_files $uri @rewriteapp | 優先服務靜態資源(css/js/圖片),不存在則轉發至 @rewriteapp 進入前端控制器。 |
rewrite ^(.*)$ /app.php/$1 last; | 將所有動態請求重寫為 /app.php/原路徑,保留 PATH_INFO。 |
fastcgi_split_path_info | 正確分離 SCRIPT_FILENAME 與 PATH_INFO,支援 Symfony 的路由系統。 |
fastcgi_param HTTPS on/off | Symfony 依此判斷 isSecure()、生成安全連結、設定 Secure Cookie 等。 |
location ~ \.php$ { return 404; } | 防禦措施:若攻擊者上傳惡意 .php 至 web/,直接返回 404,不交給 PHP-FPM 執行。 |
fastcgi_pass 指向的 PHP-FPM 是否運行、埠號是否正確、權限是否允許 Nginx 連接。try_files 順序、rewrite 正則、fastcgi_split_path_info 是否匹配實際 URL 結構。fastcgi_param HTTPS on; 已設定,且 Symfony 設定 trusted_proxies(若經過反向代理)。app_dev.php 預設僅允許本地 IP,需在檔案中放行您的客戶端 IP 或暫時關閉檢查。上述配置遵循「最小權限」原則:僅暴露必要入口、強制 HTTPS 參數傳遞、阻斷任意 PHP 執行。部署時請根據實際路徑、域名、憑證位置調整,並配合 php-fpm.conf 中的 listen、user/group、pm.max_children 等參數調優,即可獲得高效穩定的 Symfony2 生產環境。