我正在使用基于 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_code
和version
:
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
。