将子域名存储在 Nginx 配置文件的变量中
我想通过Nginx将子域名的访问转发到子目录上。
简而言之,我想要在Nginx中将http://xxx.sample.com/ 重定向到https://sample.com/xxx/,为了实现这个目的,我想将”xxx” 部分作为变量来存储域名的一部分(子域名部分)。
总结;简而言之(今北产业)
正規表現でサブドメインを変数にキャプチャして使いまわす。
$subhostにサブドメインをキャプチャする例
server_name ~^(?.+)\.sample\.com$;
Nginx の http アクセスを https に変更しながらサブディレクトリに転送http://xxx.sample.com/ → https://sample.com/xxx/
/etc/nginx/conf.d/_http.conf
## default HTTP
server {
listen 80;
server_name ~^(?.+)\.sample\.com$;
return 301 https://sample.com/$subhost$request_uri;
}
Nginx の https アクセスでサブディレクトリに転送https://xxx.sample.com/ → https://sample.com/xxx/
/etc/nginx/conf.d/_ssl.conf
## default SSL
server {
listen 443 ssl;
server_name ~^(?.+)\.sample\.com$;
return 301 https://sample.com/$subhost$request_uri;
}
总结:(关于Nginx的域名变量和Comaker)
将「*.sample.com」的子域名转移到目录下。
如果在 NS 的 DNS 设置中将 CNAME 设置如下,就可以将所有内容指向一个服务器。
* CNAME @, @ A xxx.xxx.xxx.xxx
换句话说,”kyoto.sample.com, yokohama.sample.com, …, ?????.sample.com” 可以在同一台服务器上处理。这就是针对子域名的全覆盖设置。
以前我们是在PHP端解析URL并进行分支处理,但现在决定在所有子域名上都使用Let’sEncrypt来支持SSL。然而,由于为不特定多个子域名获取SSL证书变得非常麻烦和复杂,我们决定采取以下转发方式。
http://yokohama.sample.com/?hoge=huga → https://sample.com/yokohama/?hoge=huga
横滨样品网址 (http://yokohama.sample.com/?hoge=huga) 多个选项,其中一个是:https://sample.com/yokohama/?hoge=huga
在 Nginx 的配置文件(conf 文件)中,可以使用环境变量 $host。使用此变量会导致以下内容被转发。
糟糕的设置
## default HTTP
server {
listen 80;
server_name default_server;
return 301 https://example.com/$host$request_uri;
}
糟糕的转移结果
http://hoge.sample.com/ → https://sample.com/hoge.sample.com/
http://hoge.sample.com/ → https://sample.com/hoge.sample.com/
当然是当然的,但是由于会传递整个主机信息,所以我只需要子域名。
正确的转送方法
我向StackOverflow询问了一下,他们的建议是”为什么不用正则表达式呢?” 噢…。
## default SSL
server {
listen 443 ssl;
server_name ~^(?<subhost>.+)\.sample\.com$;
return 301 https://sample.com/$subhost$request_uri;
}
那里的概念和 Apache 是一样的。因为我不熟悉 Nginx,所以忘记了基本的事情。
看了却以为看过,其实没有看过的英语官方文档。与Apache相比,令人意外的是Nginx的日语翻译并不完善。
文献引用
-
- Nginx variable for subdomain? @ Stack Overflowhttps://stackoverflow.com/questions/45318758/nginx-variable-for-subdomain
Server names | Regular expressions names @ Nginx.orghttp://nginx.org/en/docs/http/server_names.html#regex_names