Nginx将非www前缀域重写为www-prefixed域
-
06-07-2019 - |
题
我看到Nginx HttpRewriteModule文档有一个示例,将www前缀域重写为非www-prefixed domain:
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等,因为我有大量的域要重写。
解决方案 3
嗯,我想我真的不需要外面的“如果”声明,因为我只是检查xxx.xxx形式的域名。以下适用于我,虽然它不健壮。如果有更好的解决方案,请告诉我。
if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
编辑:在正则表达式中添加了连字符,因为它是主机名中的有效字符。
其他提示
如Nginx文档中所述,您应该避免使用<代码>如果可能的话,在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(如果这是您的选项,则为不同的端口)。此选项需要 website.com 和 www.website.com 的SSL证书,因此您要么拥有通配符证书,要么拥有UNI证书(多个域)或者只是两个不同的证书。
- 在应用程序中进行重写。
- 使用可怕的
if
指令。
醇>
if ($host !~* ^www\.) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
只能获得有效的主机名,因为请求永远不会进入您的服务器,因此不需要构建自己的验证逻辑。
nginx文档警告不要使用if进行重写。请在此处查看链接: http://wiki.nginx.org/Pitfalls#Server_Name
HTTP&amp;不带条件的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 #
}
不隶属于 StackOverflow