如何在 Nginx 中禁止通過 IP 直接訪問(HTTP 與 HTTPS)
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1104
在部署網站時,為了安全與品牌形象考量,通常我們只希望使用者透過「域名」訪問,而不是直接用伺服器 IP(例如 http://123.123.123.123/
)。這篇文章將教你如何在 Nginx 配置中禁止這種 IP 訪問方式,適用於 HTTP 和 HTTPS。
🧠 為什麼要禁止 IP 訪問?
-
安全性:防止外部偵測 Nginx 或網站版本訊息。
-
品牌一致性:只允許透過正式域名存取網站。
-
減少暴露面:某些攻擊可能透過 IP 掃描進行。
-
SEO 友好:避免搜尋引擎收錄 IP 對應頁面。
🔧 Nginx 配置方式
Nginx 允許我們透過設定「預設 server block」的方式,攔截所有未匹配到的請求,包括使用 IP 存取的情況。
一、禁止 IP 訪問的範本設定
# 禁止 HTTP(Port 80)
server {
listen 80 default_server;
server_name _;
return 444;
}
# 禁止 HTTPS(Port 443)
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/dummy.crt;
ssl_certificate_key /etc/nginx/ssl/dummy.key;
return 444;
}
說明:
-
default_server
:讓這個區塊成為預設處理器。 -
server_name _;
:匹配所有未被明確定義的主機名(包含 IP)。 -
return 444;
:Nginx 特有的狀態碼,會直接中斷連線,不返回任何訊息,效率更高也更隱密。 -
HTTPS 區塊需要配置 SSL 憑證,即使只是阻擋用途,也不能省略。
🛠 快速生成自簽憑證(用於 dummy SSL)
若你尚未有憑證,可用以下指令建立一組自簽名憑證作為佔位:
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/dummy.key \
-out /etc/nginx/ssl/dummy.crt \
-subj "/C=US/ST=Denial/L=Nowhere/O=Dis/CN=localhost"
✅ 檢查與重啟 Nginx
設定完成後,記得測試與重載 Nginx:
sudo nginx -t # 檢查設定是否正確
sudo systemctl reload nginx
🧪 測試是否成功
-
嘗試訪問
http://<你的伺服器IP>/
→ 應直接中斷連線或無回應。 -
嘗試訪問
https://<你的伺服器IP>/
→ 同樣應無法連線。 -
正常的域名應依然可以訪問網站內容。
📝 小結
禁止 IP 訪問雖然是個簡單的設定,但能有效提升網站的專業性與安全性。只需加上幾行配置,就能避免許多潛在問題。建議所有正式上線的 Nginx 服務都採取這項措施。
如果你有使用多個網站虛擬主機或反向代理,也可以擴展這個技巧應用於其他情境。希望這篇文章對你有所幫助!👨💻
如有任何 Nginx 配置問題,歡迎留言交流~
This article was last edited at