除非來自 nginx 上的專用網絡,否則重定向到 https

除非來自 nginx 上的專用網絡,否則重定向到 https

我想將來自網路外部的所有請求重定向到 https - 但將內部請求保留在 http 上。

現在我有兩個.conf檔案 - 其中一個開頭如下:

server {
        # listen [::]:443 ssl ipv6only=on; # managed by Certbot                                                                                                                                              
        listen 443 ssl; # managed by Certbot                                                                                                                                                                 
        server_name www.example.com , example.com;         
        # omitted stuff
}

並包含

server {
    listen 80;
    server_name www.example.com , example.com;         
    return 301 https://$host$request_uri;
}

另一個是這樣開始的:

server {                                                                                                                                                                                                     
        listen 192.168.1.144:80;                                                                                                                                                                             
        listen 192.168.1.196:80;                                                                                                                                                                             
                                                                                                                                                                                                             
        server_name "";                                                                                                                                                                                      
        root /var/www/html;                                                                                                                                                                                  
        # omitted stuff
   }

但現在要求http://example.com不要重定向到 https。

這是為什麼?我做錯了什麼?我的目標是將所有不是來自家庭專用網路 ( 192.168.1.*) 的請求重定向到 https,並保留內部請求。

答案1

server_name指令使用空格來分隔網域名稱。你的配置中有逗號,這讓 nginx 感到困惑。

您需要使用:

server_name www.example.com example.com;

答案2

我假設您正在嘗試建立一個不同的伺服器區塊來偵聽本地網路上的兩個介面:

server {
    listen 192.168.1.144:80;
    listen 192.168.1.196:80;
    # ...
}

為此,您的拓撲將類似於以下內容:

Nginx 直連網際網路的拓樸

但是,如果您的伺服器與專用網路上的用戶端具有相同的 NAT 192.168.1.0/24,則該server區塊也將用於外部連線。此拓撲類似於:

具有 NAT 和連接埠轉送的拓撲

對於後者,您可以使用例如ngx_http_geo_模組根據客戶端分離本地網路:

geo $external {
    default         1;
    192.168.1.0/24  0;
}

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    
    if ($external) {
        return 301 https://$server_name$request_uri;
    }
}

但是,從安全角度來看,我不建議像這樣信任您的內部網絡,而是對每個客戶端平等地使用 TLS。這是因為只需訪問本地網路即可輕鬆獲得 MitM 位置。

答案3

嘗試使用此方法進行重定向,對於內部,我個人更喜歡透過 IP 位址建立伺服器名稱。

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/ssl/example.crt;
    ssl_certificate_key /etc/ssl/example.key;

    server_name example.com www.example.com;

    location{
       .......
    }
}

相關內容