我希望使用Nginx配置文件nginx.conf将所有域从www重定向到non。我试过使用下面的配置,但它只适用于以HTTP开头的URL,但不适用于HTTPS
我在下面添加了服务器块
server {
server_name "~^(?!www\.).*" ;
return 301 $scheme://$1$request_uri ;
}发布于 2022-06-14 12:20:16
由于您没有在您在问题中显示的服务器块中指定侦听端口,默认情况下,它将在一个普通的HTTP端口80上侦听。您需要指定
listen 443 ssl;若要监听HTTPS TCP端口443,请执行以下操作。但是,要通过HTTPS协议使服务器块工作,您需要指定SSL证书/密钥(至少),并使用户浏览器在nginx返回的重定向之后生成用户浏览器,该证书应该是有效的证书,为要重定向的域名颁发,否则浏览器会抱怨证书无效,不会遵循重定向位置。
因此,如果您想使用某种通用的服务器块将每个HTTPS请求从www重定向到非www域,那么除非您拥有包含每个要重定向的域名的证书(对于自定义的非预定义域名列表来说,这似乎是不可能的)。
更新
虽然这不是我在生产环境中为自己做的事情,但实际上,有一种方法可以使用lua-resty-auto-ssl (见文档示例)、OpenResty/模块和以下服务器块来实现可行的解决方案(请记住,由域前缀指定的服务器名具有与服务器名称完全匹配的最低优先级比较,例如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()
}
}
}https://stackoverflow.com/questions/72612089
复制相似问题