gpt4 book ai didi

Nginx 将非 www 前缀域重写为 www 前缀域

转载 作者:行者123 更新时间:2023-12-03 07:22:37 24 4
gpt4 key购买 nike

我看到 Nginx HttpRewriteModule documentation有一个将 www 前缀域重写为非 www 前缀域的示例:

if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

如何执行相反的操作 - 将非 www 前缀域重写为 www 前缀域?我想也许我可以做如下的事情,但 Nginx 不喜欢嵌套的 if 语句。

if ($host !~* ^www\.) {                       # check if host doesn't start with www.
if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain)
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
}

此外,我希望它适用于任何域名,而无需明确告诉 Nginx 重写 domain1.com -> www.domain1.com、domain2.com -> www.domain2.com 等,因为我有大量要重写的域。

最佳答案

As noted in the Nginx documentation, you should avoid using the if directive in Nginx where possible ,因为一旦您的配置中有 if,您的服务器就需要评估每个请求,以决定是否匹配该 if

更好的解决方案是多个服务器指令。

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

server {
listen 80;
server_name www.website.com;
...
}

如果您尝试为启用 SSL (HTTPS) 的网站提供服务,则或多或少有三种不同的选择。

  1. 设置多个 IP 地址,让每个服务器指令监听自己的 IP(或者不同的端口,如果您可以选择)。此选项需要 website.comwww.website.com 的 SSL 证书,因此您要么拥有通配符证书、UNI 证书(多个域),要么只是简单地两个不同的证书。
  2. 在应用程序中进行重写。
  3. 使用可怕的 if 指令。

There is also an option to use SNI, but I'm not sure this is fully supported as of now .

关于Nginx 将非 www 前缀域重写为 www 前缀域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1629231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com