[英]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.