2015-06-08 5 views
-1

У меня есть веб-приложение, работающее на Apache, где файл виртуальных хостов настроен для маршрутизации запросов в поддомены в определенные папки. Вместо того, чтобы изменить хост-файл каждый раз, когда создается поддомен, это позволяет мне динамически направлять URL-адреса в соответствующую папку (с Catchall, если папка не существует) -Преобразование Apache VirtualHost в серверный блок nginx для динамических поддоменов

<VirtualHost *:8080> 
    ServerName localhost.com 
    ServerAlias *.localhost.com 
    VirtualDocumentRoot "/var/www/clients/%1" 
    ErrorLog "logs\errors.log" 
    <directory "/var/www/clients/%1"> 
     Options Indexes FollowSymLinks 
     AllowOverride all 
     Order Deny,Allow 
     Deny from all 
     Allow from all 
    </directory> 
</VirtualHost> 

Я пытаюсь преобразуйте приведенное выше значение в nginx, но не можете найти нужную логику для извлечения субдомена из URL-адреса, а затем установить переменную root в файле конфигурации.

Может ли кто-нибудь помочь мне написать блок server {} для nginx вместе с блоком catch-all, если путь root не существует?

+0

'server { имя_сервера ~^(. *) \. Localhost \ .com $; корень var/www/clients/$ 1; } ' – JASSY

ответ

1

Использовать именованное выражение регулярного выражения в имени сервера, на которое вы можете ссылаться позже.

server { 
    listen 8080; 
    server_name ~^(?<subdir>.*)\.localhost\.com$ ; 

    set $rootdir "/var/www/clients"; 
    if (-d "/var/www/clients/${subdir}") { set $rootdir "/var/www/clients/${subdir}"; } 
    root $rootdir; 
} 

что делает это настройка по умолчанию корневого каталога в переменную $rootdir, а затем перезаписать его, если подкаталог устанавливается $subdir существует.

+0

Большое спасибо за это. К сожалению, он работает не так, как ожидалось. в каталоге '/ var/www/clients' у меня есть каталог' client1' с index.html. У меня также есть index.html в каталоге catch-all. Если я перейду к 'http: // client1.localhost.com', nginx возвращает всю страницу (т.е. перейдя непосредственно к' $ rootdir' вместо '$ rootdir/client1'. – JASSY

+0

Я переключил порядок установки .. по умолчанию он должен теперь работать – pensivepie

+0

я изменил 'server' блок' сервер { \t слушать 8080; \t server_name * .localhost.com; \t если (-d «/ Var/WW/клиенты/$ подкаталог ") {set $ rootdir";/var/www/clients/$ subdir ";} \t if ($ rootdir ==" ") {установить $ rootdir '/ var/www/clients';} \t root $ rootdir; } 'но когда я пытаюсь перезапустить nginx с' sudo service nginx restart', он не работает. – JASSY

Смежные вопросы