EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

如何使用 Nginx 禁止 IP 直連,僅允許域名訪問

在使用 Nginx 部署網站時,可能會遇到這樣的需求:希望用戶只能通過域名訪問,而不允許直接通過 IP 地址訪問網站。本文將介紹如何通過配置 Nginx 來實現這一目標。


問題背景

當用戶通過伺服器的 IP 地址直接訪問時,可能會暴露伺服器的真實地址,甚至導致未經授權的訪問。為了解決這個問題,我們可以通過 Nginx 的「默認伺服器」功能來攔截所有 IP 直連請求,並僅允許通過特定的域名訪問網站。


解決方案概述

  1. 建立默認伺服器 (Default Server)

    • 用於處理所有沒有匹配域名的請求,包括 IP 直連。

  2. 配置域名伺服器 (Virtual Host)

    • 用於處理特定域名(如 example.com)的請求。

  3. 限制非域名請求返回錯誤或自定義提示頁面


配置步驟

以下是一個完整的配置示例:

配置內容

# 1. 默認伺服器 (處理 IP 直連)
server {
    listen 80 default_server;     # 默認伺服器,用於處理沒有匹配域名的請求
    server_name _;               # 匹配所有無 server_name 的請求

    return 403;                  # 返回 403 Forbidden,拒絕訪問
    # 或者返回自定義提示頁面
    # location / {
    #     root /var/www/html;
    #     index no_ip_access.html; # 提示用戶只能通過域名訪問
    # }
}

# 2. 域名伺服器 (處理特定域名)
server {
    listen 80;
    server_name example.com www.example.com;  # 允許訪問的域名

    location / {
        root /var/www/example;   # 網站根目錄
        index index.html;        # 預設首頁
    }
}

配置解釋

  1. 默認伺服器

    • listen 80 default_server:將此伺服器設置為默認伺服器,用於處理所有沒有匹配 server_name 的請求。

    • server_name _:匹配所有無明確域名的請求(例如 IP 直連)。

    • return 403:直接返回 HTTP 403 錯誤,禁止訪問。

  2. 域名伺服器

    • server_name example.com www.example.com:僅允許指定的域名訪問。

    • rootindex:定義網站的根目錄和預設首頁。


應用和測試

1. 測試配置是否正確

在修改完配置文件後,使用以下命令測試配置是否有效:

sudo nginx -t

如果顯示 syntax is ok,表示配置文件語法正確。

2. 重載 Nginx 配置

運行以下命令使新配置生效:

sudo nginx -s reload

3. 測試效果

  • 通過域名訪問: 在瀏覽器中輸入 http://example.com,網站應正常打開。

  • 通過 IP 地址訪問: 在瀏覽器中輸入伺服器的 IP(如 http://123.45.67.89),應返回 403 Forbidden 或自定義提示頁面。


擴展功能:HTTPS 支持

如果網站使用了 HTTPS,還需要為 HTTPS 配置類似的限制。

HTTPS 配置示例

# 默認伺服器 (禁止 HTTPS 的 IP 直連)
server {
    listen 443 ssl default_server;
    server_name _;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    return 403;  # 禁止訪問
}

# 域名伺服器 (HTTPS 的正常域名訪問)
server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        root /var/www/example;
        index index.html;
    }
}

測試 HTTPS 訪問

  • 確保域名(如 https://example.com)正常訪問。

  • 測試 IP 地址直連(如 https://123.45.67.89),應返回 403 Forbidden。


總結

通過合理的 Nginx 配置,我們可以有效地防止用戶通過 IP 地址直接訪問網站,強制用戶只能通過域名訪問。這不僅增強了伺服器的安全性,也有助於隱藏伺服器的真實地址。

如果你的網站需要支持更多功能(例如反向代理或負載均衡),可以基於這些配置進一步擴展。

This article was last edited at 2025-01-27 10:32:22

Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).

There is 16h06m54s left until you can comment.