Nginx

如何在 Nginx 中解析和檢索子域和主機名標籤

  • May 11, 2015

我正在使用基於 nginx + php-fpm + mysql 堆棧上的幾個 magento 版本的測試環境,我將每個分發版放在不同的文件夾中,並在 nginx vhost 配置文件中使用以下句子:

server_name ~^(?<version>.+)\.magento\.test$;
根 [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 尋找:**$$ root_path $$/distro/us.ce107/$$ root_path $$/distro/ar.ce107/**文件夾。

所以我需要解析和檢索以下值:

[ws_code].[version].magento.test 

我不知道該怎麼做,也許我可以使用“地圖 $ host $ ws_code {}" 來解析 $ ws_code value, and apply some regex to remove “ws_code.” part from the $ 版本

順便說一句,顯然我可以“編碼”,但我想保持“動態”

有人可以幫忙嗎?提前致謝!

(?<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 matchig 上的附加()?大括號將允許此配置匹配只有一個可用變數的 3 級域和具有兩個可用變數的 4 級域。您可能希望為ws_code.

引用自:https://serverfault.com/questions/691031