我有许多域名链接到同一个 php 目录,我需要将它们全部从非 www、非 https 重定向到 www、https。
# Add www, if missing
server {
server_name "~^(?!www\.).*";
listen 80;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/zipy_co_il_new.pem;
ssl_certificate_key /etc/nginx/ssl/zipy_co_il_new.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
rewrite ^/(.*) https://www.$host/$1 permanent;
}
# Redirect to https
server {
server_name "~^(www\.).*";
listen 80;
rewrite ^/(.*) https://$host/$1 permanent;
}
# Redirect to https
server {
server_name 144.76.173.84;
listen 80;
rewrite ^/(.*) https://$host/$1 permanent;
}
# Site description
server {
server_name "~^(www\.).*";
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/zipy_co_il_new.pem;
ssl_certificate_key /etc/nginx/ssl/zipy_co_il_new.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
set $root_path /var/www/<path..>
这个工作正常,但现在我必须向我的域名添加一个子域名,并且我不希望子域名重定向到 www,但希望重定向到 https,所以我尝试将第三行更改为(对于 m.子域名)
server_name "~^(?!www\.)(?!m\.).*";
但它仍将 m. 重定向至 www.m.
答案1
您已检查每个不以 开头的请求是否www
被重定向并获得额外的www
。由于m.example.org
不以 开头,www
因此将添加前缀。
您可以通过多种方式解决这个问题,但为了与您的方法保持一致,让我们改进正则表达式
server_name "~^([^.]*\.[^.]*)$";
因此,如果服务器名称由两部分组成(即裸域),则在其前面加上www
。如果它使用子域,则只需按原样提供服务即可。不幸的是,这仅适用于 .com 或 .org 等简单域。但对于 .co.uk 之类的域名,它将失败。
在这种情况下,我们需要将实际的顶级域名指定为正则表达式的一部分:
server_name "~^([^.]*\.(co\.uk|net|org|com))$";
这会将所有裸域名移至www
。子域名将保持不变。