我看到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等,因为我有大量的域重写。
由于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)启用网站,你有或多或少的三个不同的选项。
- 设置多个IP地址,让每个服务器指令监听自己的IP(或不同的端口,如果这是一个选项,供您)。 这个选项需要SSL证书都website.com和www.website.com,所以要么你有一个外卡证书,证书UNI(多个域)或只是清楚两种不同的证书。
- 不要在应用程序重写。
- 使用令人恐惧的
if
指令。
也有使用SNI一种选择,但我不知道这是完全支持,截至目前 。
if ($host !~* ^www\.) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
嗯,我想我并不真的需要外“if”语句,因为我只检查形式的域名反正XXX.XXX。 对我来说,以下的作品,虽然它并不强劲。 让我知道如果有一个更好的解决方案。
if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
编辑:加连字符正则表达式,因为它是一个主机名的有效字符。
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
这是唯一可能得到有效的主机名,因为该请求将永远不会进入你的服务器,否则,因此没有必要建立自己的验证逻辑。
nginx的文档告诫不要使用,如果重写。 请在这里看到的链接: http://wiki.nginx.org/Pitfalls#Server_Name
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 #
}