Назад | Перейти на главную страницу

Как проанализировать и получить метку имени поддомена и хоста в Nginx

Я работаю со средой для целей тестирования, основанной на нескольких версиях magento через стек nginx + php-fpm + mysql, я помещаю каждый дистрибутив в разные папки, а в файле конфигурации nginx vhost я использую следующее предложение:

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

Итак, пока здесь я могу получить любой динамический URL-адрес, сопоставленный с его папкой

ce107.magento.test => [root_path]/distro/ce107/
ce108.magento.test => [root_path]/distro/ce108/
ce109.magento.test => [root_path]/distro/ce109/

Проблема начинается, когда я пытаюсь использовать «метку имени хоста» для переключения веб-сайтов в каждом дистрибутиве:

us.ce107.magento.test, ar.ce107.magento.test ... 

потому что nginx ищет: [корневой_путь] /distro/us.ce107/ и [корневой_путь] /distro/ar.ce107/ папки.

Поэтому мне нужно проанализировать и получить значения:

 [ws_code].[version].magento.test  

и я не могу понять, как это сделать, может быть, я мог бы использовать «map $ host $ ws_code {}» для анализа значения $ ws_code и применить какое-нибудь регулярное выражение для удаления «ws_code». часть из $ версии

Кстати, очевидно, что я могу сделать это "жестко", но я хочу, чтобы это было "динамично"

Может ли кто-нибудь помочь с этим? Заранее спасибо!

В (?<version>.+) regexp будет использовать жадное совпадение и назначить его $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 matchig позволят этой конфигурации соответствовать как домену 3-го уровня с одной доступной переменной, так и домену 4-го уровня с двумя доступными переменными. Вы можете захотеть назначить переменную по умолчанию для ws_code.