将子域名存储在 Nginx 配置文件的变量中

我想通过Nginx将子域名的访问转发到子目录上。

简而言之,我想要在Nginx中将http://xxx.sample.com/ 重定向到https://sample.com/xxx/,为了实现这个目的,我想将”xxx” 部分作为变量来存储域名的一部分(子域名部分)。

? 2018/08/06 追加:2018/03/02にLet’s Encryptはワイルドカード(*の使用)をサポートするようになりました。この記事では、「サブドメインのアクセスを別のドメインのディレクトリにリダイレクトする」のではなく、ワイルドカードSSLを使用したい場合は、他のQiita記事を参照してください。

总结;简而言之(今北产业)

正規表現でサブドメインを変数にキャプチャして使いまわす。

$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

广告
将在 10 秒后关闭
bannerAds