Ранее мы написали решение, которое динамически получает корень документа на основе указанного домена или псевдонима домена. Он использует базу данных mysql для хранения сопоставлений доменных имен и псевдонимов. Ссылка на него http://www.logicwreck.com/index.php/2012/09/11/dynamic-hosts-for-nginx-with-database-storage-of-domain-and-alias- info /
Довольно интересный способ взлома, так как он может помешать вам иметь несколько настроенных виртуальных хостов и вместо этого иметь только один.
В моем корневом решении для документов также используется Lua, но вместо базы данных используется сценарий bash. Короче говоря, он меняет местами части домена и использует их в качестве структуры каталогов. В этой структуре каталоги с префиксом _ могут использоваться для различения корней документов от поддоменов.
например domain.com -> com / domain / _public sub.domain.com -> com / domain / sub / _public
server_name _ ~^(?<www>www\.)?(?<domain>[a-zA-Z0-9-\.]+)$;
set_by_lua $docRoot "
local f = assert(io.popen('/path/to/conversion/script.sh '..ngx.var.domain, 'r'))
local s = assert(f:read('*a'))
f:close()
return s
";
root /var/www/$docRoot/_public;
Тогда мой сценарий преобразования:
echo $1 | tr "." "\n" | tac | tr "\n" "/" | rev | cut -b 2- | rev | tr -d "\n"
Cut удаляет дополнительную косую черту, в то время как последний tr необходим, потому что наличие новой строки в корне nginx обрезает / _public
Я без проблем управляю десятками подобных доменов. Это может быть медленнее, чем генератор конфигурации на основе шаблона для каждого домена, но я предпочитаю иметь один файл для устранения неполадок.