首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用nginx配置文件nginx.conf将所有https域从www重定向到非www?

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

Stack Overflow用户
提问于 2022-06-14 05:50:23
回答 1查看 140关注 0票数 0

我希望使用Nginx配置文件nginx.conf将所有域从www重定向到non。我试过使用下面的配置,但它只适用于以HTTP开头的URL,但不适用于HTTPS

我在下面添加了服务器块

代码语言:javascript
复制
server {
    server_name "~^(?!www\.).*" ;
    return 301 $scheme://$1$request_uri ;
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-14 12:20:16

由于您没有在您在问题中显示的服务器块中指定侦听端口,默认情况下,它将在一个普通的HTTP端口80上侦听。您需要指定

代码语言:javascript
复制
listen 443 ssl;

若要监听HTTPS TCP端口443,请执行以下操作。但是,要通过HTTPS协议使服务器块工作,您需要指定SSL证书/密钥(至少),并使用户浏览器在nginx返回的重定向之后生成用户浏览器,该证书应该是有效的证书,为要重定向的域名颁发,否则浏览器会抱怨证书无效,不会遵循重定向位置。

因此,如果您想使用某种通用的服务器块将每个HTTPS请求从www重定向到非www域,那么除非您拥有包含每个要重定向的域名的证书(对于自定义的非预定义域名列表来说,这似乎是不可能的)。

更新

虽然这不是我在生产环境中为自己做的事情,但实际上,有一种方法可以使用lua-resty-auto-ssl (见文档示例)、OpenResty/模块和以下服务器块来实现可行的解决方案(请记住,由域前缀指定的服务器名具有与服务器名称完全匹配的最低优先级比较,例如www.example.com,或由域后缀指定的服务器名称,例如*.example.com):

代码语言:javascript
复制
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挑战:

代码语言:javascript
复制
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()
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72612089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档