我在检测 中的子域名时遇到了问题server_name
。我的用户可以在我的门户中“注册”他们的域名。他们只能为他们的子域名 ( user-domain.com
) 或/和通配符 ( *.user-domain.com
) 或通配符注册域名 ( *.special.user-domain.com
)。有一个限制可以避免“链接”,如果 user-domain.com 已注册,他们就不能注册whatever.user-domain.com
为域名。它只是user-domain.com
对于每个未注册为通配符的域名,我在 sites-available 文件夹中创建 nginx 服务器块配置。稍后我将 site-eabled 链接到正确的 site-available 配置。示例:
server {
listen 443 ssl;
server_name user-domain.com;
ssl_certificate /etc/nginx/ssl/user-domain.com/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/user-domain.com/user-domain.com.key;
}
证书通过以下方式创建acme.sh对于完整域名,通过 spining temp webserver 进行,对于通配符,通过 dns 提供商 api 进行。对于通配符域名,我使用这样的正则表达式,但似乎不起作用。
server {
listen 443 ssl;
server_name ~^(.*)\.wildcarded\.com$ ;
ssl_certificate /etc/nginx/ssl/wildcarded.com/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/wildcarded.com/wildcarded.com.key
.
.
.
}
我的解决方案是实现该目标的正确方法吗?正确的正则表达式应该是什么?
答案1
根据NGINX 手册上的服务器名称对于通配符域来说,以下解决方案是最简单的,避免使用正则表达式匹配:
server {
listen 443 ssl;
server_name *.example.org;
...
}
另请注意,手册中写道:
按名称搜索虚拟服务器时,如果名称与多个指定的变体匹配(例如,通配符名称和正则表达式匹配),则将按照以下优先顺序选择第一个匹配的变体:
- 确切名称
- 以星号开头的最长通配符名称,例如“*.example.org”
- 以星号结尾的最长通配符名称,例如“mail.*”
- 第一个匹配的正则表达式(按配置文件中出现的顺序)