如何在 Nginx 中解析和检索子域名和主机名标签

如何在 Nginx 中解析和检索子域名和主机名标签

我正在使用基于 nginx + php-fpm + mysql 堆栈上的几个 magento 版本的测试环境,我将每个分发放在不同的文件夹中,并在 nginx vhost 配置文件中使用以下句子:

服务器名称 ~^(?<版本>.+)\.magento\.test$;
根 [root_path]/distro/$version;

所以直到这里我可以将任何动态 URL 映射到其文件夹

ce107.magento.test => [根路径]/distro/ce107/
ce108.magento.test => [根路径]/distro/ce108/
ce109.magento.test => [根路径]/distro/ce109/

当我尝试使用“主机名标签”在每个发行版上切换网站时,问题就开始了:

我们.ce107.magento.测试,ar.ce107.magento.测试...

因为 nginx 寻找:[根路径]/distro/us.ce107/[根路径]/distro/ar.ce107/文件夹。

所以我需要解析并检索以下值:

[ws_code].[版本].magento.测试  

我不知道该怎么做,也许我可以使用“map $host $ws_code {}”来解析 $ws_code 值,并应用一些正则表达式从 $version 中删除“ws_code。”部分

顺便说一句,显然我可以做到“硬编码”,但我想保持它的“动态”

有人能帮忙吗?提前谢谢!

答案1

正则表达式(?<version>.+)将使用贪婪匹配并将其分配给$version变量。您可以执行相同的操作来匹配ws_codeversion

server_name ~^(?<ws_code>.+)\.(?<version>.+?)\.magento\.test$;
root [root_path]/distro/$version/$ws_code;

我曾使用过贪婪匹配[ws_code]和非贪婪匹配[version]。此外,我还会使用一些更具确定性的算法,例如[a-zA-Z0-9-]+从可能的匹配中排除域分隔符点符号,如下所示(在这种情况下,我们不需要检查匹配算法是否贪婪):

server_name ~^((?<ws_code>[a-z]+)\.)?(?<version>[a-zA-Z0-9-]+)\.magento\.test$;
root [root_path]/distro/$version;

ws_code 匹配上的附加()?括号将允许此配置匹配仅有一个变量可用的 3 级域和有两个变量可用的 4 级域。您可能需要分配默认变量为了ws_code

相关内容