利用 location 正則匹配攔截特定目錄下的 PHP 檔案請求,直接回傳 403。
# 禁止 attachments、images 目錄執行 PHP
location ~* ^/(attachments|images)/.*\.(php|php5|PHP|PHP5)$ {
deny all;
}
# 針對 /discuz/、/bbs/ 專案下的上傳目錄
location ~* ^(/discuz/|/bbs/)/(attachments|images)/.*\.(php|php5|PHP|PHP5)$ {
deny all;
}
~*:不區分大小寫匹配(涵蓋 .php、.PHP、.Php 等)^/(...)/:錨定路徑開頭,避免誤匹配同名子目錄(attachments|images):群組匹配多個敏感目錄名.*\.(php|php5|PHP|PHP5)$:匹配任意 PHP 副檔名結尾deny all;:直接拒絕,回傳 403 Forbiddennginx -t && nginx -s reload# 禁止上傳目錄執行任何腳本類副檔名
location ~* ^/uploads/.*\.(php|php5|phtml|phar|jsp|asp|aspx|py|pl|cgi)$ {
deny all;
access_log off; # 可選:不記錄存取日誌
}
# 僅允許特定 IP 存取管理後台
location ^~ /admin/ {
allow 192.168.1.0/24;
allow 10.0.0.5;
deny all;
# PHP 處理規則...
}
Apache 需在 .htaccess 或 <Directory> 使用 RemoveHandler / php_flag engine off,語法較繁瑣且易被覆寫。Nginx 以單一 location 規則即可集中管理,維護性極佳。