phpMyAdmin 等敏感管理介面僅允許內網 IP 存取,拒絕公網存取,同時保持主站正常對外服務。
location ~ ^/phpmyadmin/ (正則) 優先級 高於 location / (前綴)server {
listen 80;
server_name example.com;
access_log logs/access.log main;
# 主站根目錄
location / {
root html;
index index.php index.html index.htm;
}
# phpMyAdmin 內網限制 (正則匹配,優先級高)
location ~ ^/phpmyadmin/ {
allow 192.168.1.0/24; # 允許內網網段
deny all; # 拒絕其他所有
# 內層 PHP 處理 (必須重新定義,否則繼承外層導致 404)
location ~ \.php$ {
root /var/www/html; # phpMyAdmin 實際路徑
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
# 通用 PHP 處理 (主站用)
location ~ \.php$ {
root /opt/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
location ~ ^/download/ {
allow 192.168.1.0/24;
deny all;
index index.php index.html;
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
| 語法 | 範例 | 說明 |
|---|---|---|
| 單一 IP | allow 192.168.1.100; | 精確匹配 |
| CIDR 網段 | allow 192.168.1.0/24; | 256 個 IP |
| 子網路遮罩 (舊) | allow 192.168.1.0/255.255.255.0; | 等同 /24 |
| 多條規則 | allow 10.0.0.0/8; allow 192.168.0.0/16; | 順序執行,匹配即停止 |
| 預設拒絕 | deny all; | 必須放在 allow 之後 |
# http 區塊
geoip_country /usr/share/GeoIP/GeoIP.dat;
# server 區塊
location ~ ^/admin/ {
# 僅允許台灣 IP
if ($geoip_country_code != "TW") {
return 403;
}
# ...
}
# 測試配置語法
nginx -t
# 模擬不同 IP 存取 (需安裝 ngx_http_realip_module 並設定 real_ip_header)
curl -H "X-Forwarded-For: 192.168.1.50" https://example.com/phpmyadmin/
curl -H "X-Forwarded-For: 203.0.113.10" https://example.com/phpmyadmin/
# 查看錯誤日誌
tail -f /var/log/nginx/error.log
location ~ \.php$ → PHP 檔案直接下載或 404allow/deny 順序錯誤 → 全部被允許或全部被拒絕location /phpmyadmin/ (前綴) 而非正則 → 無法正確攔截子路徑