簡體   English   中英

如何使用 nginx 配置文件 nginx.conf 將所有 https 域從 www 重定向到非 www?

[英]How to redirect all https domain from www to non www using nginx config file nginx.conf?

我想使用 Nginx 配置文件 nginx.conf 將所有域從 www 重定向到非 www。 我嘗試使用以下配置,但它僅適用於以 HTTP 開頭的 URL,但不適用於 HTTPS

我在服務器塊下面添加了

server {
    server_name "~^(?!www\.).*" ;
    return 301 $scheme://$1$request_uri ;
}

由於您沒有在問題中顯示的服務器塊中指定偵聽端口,因此默認情況下它將偵聽普通的 HTTP TCP 端口 80。 您需要指定

listen 443 ssl;

偵聽 HTTPS TCP 端口 443。但是,要使服務器阻止通過 HTTPS 協議工作,您需要指定 SSL 證書/密鑰(至少),並在 nginx 返回的重定向之后創建用戶瀏覽器,該證書應該是為您要重定向的域名頒發的有效證書,否則瀏覽器將抱怨無效證書並且不會跟隨重定向位置。

因此,如果您想使用某種通用服務器塊將每個 HTTPS 請求從 www 重定向到非 www 域,除非您擁有包含要重定向的每個域名的證書,否則這是不可能的(這似乎是不可能的有一個自定義的非預定義域名列表)。


更新

雖然這不是我在生產環境中為自己做的事情,但實際上一種方法可以使用lua-resty-auto-ssl (參見文檔示例)、 OpenResty / lua-nginx-module來實現可行的解決方案和以下服務器塊(請記住,與完全匹配的服務器名稱相比,由域前綴指定的服務器名稱具有最低優先級,例如www.example.com或由域后綴指定的服務器名稱,例如*.example.com ):

init_by_lua_block {
    auto_ssl = (require "resty.auto-ssl").new()
    auto_ssl:set("allow_domain", function(domain)
        return true
    end)
    auto_ssl:init()
}

map $host $basename {
    ~^www\.(.+)  $1;
    default      $host;
}

server {
    listen 443 ssl;
    server_name www.*;

    ssl_certificate_by_lua_block {
        auto_ssl:ssl_certificate()
    }

    ssl_certificate /path/to/dummy.crt;
    ssl_certificate_key /path/to/dummy.key;

    return 301 https://$basename$request_uri;
}

為了使其工作,您還需要相應的純 HTTP 塊以允許 ACME 挑戰成功完成:

server {
    listen 80;
    server_name www.*;

    location / {
        return 301 https://$basename$request_uri;
    }

    location /.well-known/acme-challenge/ {
        content_by_lua_block {
            auto_ssl:challenge_server()
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM