在使用 Nginx 部署網站時,可能會遇到這樣的需求:希望用戶只能通過域名訪問,而不允許直接通過 IP 地址訪問網站。本文將介紹如何通過配置 Nginx 來實現這一目標。
問題背景
當用戶通過伺服器的 IP 地址直接訪問時,可能會暴露伺服器的真實地址,甚至導致未經授權的訪問。為了解決這個問題,我們可以通過 Nginx 的「默認伺服器」功能來攔截所有 IP 直連請求,並僅允許通過特定的域名訪問網站。
解決方案概述
-
建立默認伺服器 (Default Server)
-
用於處理所有沒有匹配域名的請求,包括 IP 直連。
-
-
配置域名伺服器 (Virtual Host)
-
用於處理特定域名(如
example.com
)的請求。
-
-
限制非域名請求返回錯誤或自定義提示頁面。
配置步驟
以下是一個完整的配置示例:
配置內容
# 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; # 預設首頁
}
}
配置解釋
-
默認伺服器
-
listen 80 default_server
:將此伺服器設置為默認伺服器,用於處理所有沒有匹配server_name
的請求。 -
server_name _
:匹配所有無明確域名的請求(例如 IP 直連)。 -
return 403
:直接返回 HTTP 403 錯誤,禁止訪問。
-
-
域名伺服器
-
server_name example.com www.example.com
:僅允許指定的域名訪問。 -
root
和index
:定義網站的根目錄和預設首頁。
-
應用和測試
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 地址直接訪問網站,強制用戶只能通過域名訪問。這不僅增強了伺服器的安全性,也有助於隱藏伺服器的真實地址。
如果你的網站需要支持更多功能(例如反向代理或負載均衡),可以基於這些配置進一步擴展。
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.