Nginx的重写无www前缀的域名到www前缀的域名(Nginx rewrite non-www-p

2019-09-01 10:44发布

我看到Nginx的HttpRewriteModule文档具有一个例子来重写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'
}

我该怎么办的reverse--改写无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等,因为我有大量的域重写。

Answer 1:

由于Nginx的文件中指出,应避免使用if指令中的Nginx在可能的情况 ,因为一旦你有一个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(或不同的端口,如果这是一个选项,供您)。 这个选项需要SSL证书都website.comwww.website.com,所以要么你有一个外卡证书,证书UNI(多个域)或只是清楚两种不同的证书。
  2. 不要在应用程序重写。
  3. 使用令人恐惧的if指令。

也有使用SNI一种选择,但我不知道这是完全支持,截至目前 。



Answer 2:

if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}


Answer 3:

嗯,我想我并不真的需要外“if”语句,因为我只检查形式的域名反正XXX.XXX。 对我来说,以下的作品,虽然它并不强劲。 让我知道如果有一个更好的解决方案。

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

编辑:加连字符正则表达式,因为它是一个主机名的有效字符。



Answer 4:

if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

这是唯一可能得到有效的主机名,因为该请求将永远不会进入你的服务器,否则,因此没有必要建立自己的验证逻辑。



Answer 5:

nginx的文档告诫不要使用,如果重写。 请在这里看到的链接: http://wiki.nginx.org/Pitfalls#Server_Name



Answer 6:

HTTP和HTTPS如果没有条件:

server {
    listen          80;
    listen          443;
    server_name     website.com;

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

    # Your config goes here #
}


文章来源: Nginx rewrite non-www-prefixed domain to www-prefixed domain