
我有一個 Nginx 伺服器,它託管網站的主網域foo.com
和子網域。bar.foo.com
我只有主網域的證書,因此我只需要子網域的 HTTP 請求。我已經配置了兩個伺服器區塊,並且所有請求都運作良好:http://foo.com
將被重新導向到https://foo.com
,並且http://bar.foo.com
僅停留在 HTTP 上。
但是,當我嘗試連線時出現了問題https://bar.foo.com
,儘管我沒有配置子網域伺服器區塊來偵聽 443 或 ssl 請求,但該請求仍然被處理,並且在從瀏覽器收到憑證具有不同主機名稱的警告後與我請求的頁面相比,我獲得的頁面來自主網域foo.com
。
因此,顯然,原本server
應該只偵聽我的主網域的 HTTPS 請求的區塊不知何故也在偵聽子網域的 HTTPS 請求,我不希望這種情況發生。
這是我的主域設定:
server {
listen 80;
server_name foo.com www.foo.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name foo.com www.foo.com;
ssl on;
ssl_certificate /etc/nginx/cert/foo.com.pem;
ssl_certificate_key /etc/nginx/cert/foo.com.key;
...
location / {
root /var/www/foo.com/public_html;
index index.html index.htm;
}
}
這是我的子網域配置:
server {
listen 80;
server_name bar.foo.com www.bar.foo.com;
location / {
root /var/www/bar.foo.com/public_html;
index index.html index.htm;
}
}
這是 Nginx 設定檔的片段:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
}
我嘗試在我的主網域的 443 伺服器區塊中刪除foo.com
after listen
,但這沒有幫助。
我希望 Nginx 要么不監聽諸如此類的請求,https://bar.foo.com
要么簡單地返回 404 或 444。
答案1
由於您只server
為連接埠 443 配置了一個區塊,因此它是 nginx 使用的預設虛擬伺服器來為連接埠 443 的所有請求提供服務。
若要新增連接埠 443 (TLS) 的預設伺服器,您可以新增下列虛擬主機:
server {
listen 443 default_server;
server_name _;
return 444;
}
答案2
我已經想出了解決辦法。就像 @Tero 和 @Cosmic 正確指出的那樣,我唯一的server
主域 443 區塊被設定server
為所有 443 請求的預設區塊。
我server
在Nginx設定檔中註釋了該區塊/etc/nginx/nginx.conf
,並添加了以下兩個server
區塊:
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/cert/foo.bar.pem;
ssl_certificate_key /etc/nginx/cert/foo.bar.key;
return 444;
}
第一個將被設定為server
任何 HTTP 請求的預設區塊,刪除任何不匹配的請求,同樣,第二個將刪除任何不匹配的 443 或 HTTPS 請求。
@Tero 提供的解決方案不起作用,因為 Nginx 需要任何 SSLserver
區塊的證書,因此您需要為其提供證書。