在 LNMP(Linux + Nginx + MySQL + PHP)架構中,為了增強伺服器安全性,防止惡意上傳的 PHP 腳本在上傳目錄或靜態資源目錄中被執行,我們通常需要在 Nginx 虛擬主機配置中針對特定目錄禁用 PHP 解析權限。本文詳細說明如何通過 location 指令匹配目錄並拒絕存取,以及配置生效的完整流程。
Nginx 處理請求時,location 匹配遵循「優先前綴匹配,再正則匹配」的原則。要使禁用 PHP 的規則生效,必須將其放在通用的 PHP 處理 location(如 location ~ \.php$)之前。否則請求會優先進入 FastCGI 處理流程,導致禁用規則失效。
若僅需針對單一目錄(例如 attachments)禁用 PHP,可在 server 區塊中添加如下配置:
location ~ /attachments/.*\.(php|php5)?$ {
deny all;
}
該規則使用正則表達式匹配 /attachments/ 目錄下所有以 .php 或 .php5 結尾的請求,直接返回 403 Forbidden。
若需同時禁用多個目錄(如 attachments、upload、data 等),可使用正則分組:
location ~ /(attachments|upload|data)/.*\.(php|php5)?$ {
deny all;
}
此寫法更易維護,新增目錄只需在括號內用 | 分隔即可。
以下為一個典型的 Discuz! 論壇虛擬主機配置,已整合多目錄 PHP 禁用規則:
server {
listen 80;
server_name www.example.com;
index index.html index.htm index.php;
root /home/wwwroot/bbs.example.com;
include discuz.conf;
# 禁用特定目錄 PHP 執行權限(必須置於 PHP 處理 location 之前)
location ~ /(attachments|upload)/.*\.(php|php5)?$ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
access_log off;
}
/usr/local/nginx/sbin/nginx -t/usr/local/nginx/sbin/nginx -s reloadhttps://your-domain.com/uploads/test.php,應返回 403 Forbidden。location ~ \.php$ 之前,否則不生效。\.),避免匹配到類似 phpx 的文件。~* 替換 ~。/attachments/.* 會遞歸匹配所有子目錄,滿足大多數場景需求。通過合理配置 Nginx 存取控制,可有效阻斷利用上傳漏洞執行惡意腳本的攻擊鏈,是 LNMP 環境安全加固的基礎且關鍵的一環。