2014-12-15 5 views
0

Я хочу провести несколько доменных имен, каждый из поддоменов динамически на моем Nginx сервере (убунту 14.04):как динамически искоренять с помощью домена и поддомена в Nginx конфигурации

home/serve/ 
    domain1.com 
     www 
     subdomain1 
     subdomain2 
    domain2.com 
     www 
     subdomain1 
     subdomain2 

Я хочу как www.domain1. com и domain1.com для root в/home/serve/domain1/www и subdomain1.domain1.com для root в/home/serve/domain1/subdomain1.

У меня это работает для домена как с www, так и без него. (см. ниже), но я не могу разобраться, как я могу расширить это, чтобы также укрепить root.

server { 
    listen 80 default_server; 
    listen [::]:80 default_server ipv6only=on; 

    server_name ~^(www\.)?(?<domain>.+)$; 

    root  /home/serve/$domain/www/; 

    location/{ 
     index index.html index.htm index.php; 
    } 

    location ~ [^/]\.php(/|$) { 
     fastcgi_split_path_info ^(.+?\.php)(/.*)$; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     include fastcgi_params; 
    } 
} 
+1

Дело в том, что если вы настроили такую ​​конфигурацию, нелегко отличить, какая часть является доменю, а какая является субдоменом, то есть, если я перехожу на 'example.com', это субдомен« пример » домен 'com'? Подождите, если вы справитесь с этим, он должен работать. Вам просто нужно создать каталог 'com' с символической ссылкой' example', которая ссылается на 'example.com/www'. – Carsten

+0

@ Карстен. Да, это вопрос, с которым я сталкиваюсь с этим подходом, но пока это самое близкое, что я получил к тому, что хочу. Если это не очень хороший способ, вы можете предложить альтернативу. – Finglish

+0

Возможно ли мой подход с символическими ссылками для вас? В противном случае, есть ли у вас какая-то информация о доменах, чтобы как-то убить эту неоднозначность? Может быть, требуется, чтобы домен представлял две неточечные строки с точкой между ними? – Carsten

ответ

3

Вы можете расширить свое регулярное выражение, включив в него любой субдомен, а не только www. Кроме того, было бы неплохо настроить папку по умолчанию, если папка для запрошенного субдомена не существует.

Нечто подобное должно работать нормально:

server_name ~^(?<subdomain>\w*?)?\.?(?<domain>\w+\.\w+)$; 

if ($subdomain = "") { 
    set $subdomain "www"; 
} 

if (!-d "/home/serve/$domain/$subdomain") { 
    set $subdomain "www"; 
} 

root "/home/serve/$domain/$subdomain"; 

Обратите внимание, что даже если с помощью «если» директива, как правило, нецелесообразна, в данном конкретном случае она является полностью безопасной и приемлемой, так как эти директивы определены в сервера.

+0

Это выглядит хорошо, я дам ему попробовать завтра и обновить его. Благодарим вас за комментирование вашего использования выражения if в этом случае. Я так привык видеть предупреждения «IFISEVIL», что я сразу нервничаю, когда вижу, что он используется. Мне тоже нравится резерв www. – Finglish

+0

Этот подход работает только для субдоменов одного уровня, а не для sub.sub.domain.com, это не проблема в моем случае, но это хорошо заметить. Для меня важнее то, что он работает с доменами, такими как domain.co.uk – Finglish