Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

LNMP 環境下禁止 Nginx 特定目錄執行 PHP 腳本的配置方法

編輯:關於伺服器

在 LNMP(Linux + Nginx + MySQL + PHP)架構中,為了增強伺服器安全性,防止惡意上傳的 PHP 腳本在上傳目錄或靜態資源目錄中被執行,我們通常需要在 Nginx 虛擬主機配置中針對特定目錄禁用 PHP 解析權限。本文詳細說明如何通過 location 指令匹配目錄並拒絕存取,以及配置生效的完整流程。

核心原理:優先匹配順序

Nginx 處理請求時,location 匹配遵循「優先前綴匹配,再正則匹配」的原則。要使禁用 PHP 的規則生效,必須將其放在通用的 PHP 處理 location(如 location ~ \.php$)之前。否則請求會優先進入 FastCGI 處理流程,導致禁用規則失效。

單一目錄禁用 PHP 執行權限

若僅需針對單一目錄(例如 attachments)禁用 PHP,可在 server 區塊中添加如下配置:

location ~ /attachments/.*\.(php|php5)?$ {
    deny all;
}

該規則使用正則表達式匹配 /attachments/ 目錄下所有以 .php 或 .php5 結尾的請求,直接返回 403 Forbidden。

多目錄批量禁用 PHP 執行權限

若需同時禁用多個目錄(如 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;
}

配置生效驗證步驟

  1. 修改配置文件後,先測試語法:
    /usr/local/nginx/sbin/nginx -t
  2. 語法無誤後,平滑重載配置:
    /usr/local/nginx/sbin/nginx -s reload
  3. 驗證:嘗試訪問 https://your-domain.com/uploads/test.php,應返回 403 Forbidden。

常見錯誤與注意事項

  • 順序錯誤:禁用 location 必須寫在 location ~ \.php$ 之前,否則不生效。
  • 正則轉義:路徑中的點號需轉義(\.),避免匹配到類似 phpx 的文件。
  • 大小寫敏感:Nginx 正則預設區分大小寫,若需忽略大小寫可用 ~* 替換 ~。
  • 包含子目錄:上述正則 /attachments/.* 會遞歸匹配所有子目錄,滿足大多數場景需求。

通過合理配置 Nginx 存取控制,可有效阻斷利用上傳漏洞執行惡意腳本的攻擊鏈,是 LNMP 環境安全加固的基礎且關鍵的一環。

Copyright © Windows教程網 All Rights Reserved