如何在 Nginx 中禁止通過 IP 直接訪問(HTTP 與 HTTPS)

| Linux | 2 Reads

在部署網站時,為了安全與品牌形象考量,通常我們只希望使用者透過「域名」訪問,而不是直接用伺服器 IP(例如 http://123.123.123.123/)。這篇文章將教你如何在 Nginx 配置中禁止這種 IP 訪問方式,適用於 HTTP 和 HTTPS。


🧠 為什麼要禁止 IP 訪問?

  1. 安全性:防止外部偵測 Nginx 或網站版本訊息。

  2. 品牌一致性:只允許透過正式域名存取網站。

  3. 減少暴露面:某些攻擊可能透過 IP 掃描進行。

  4. 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