Question Est-ce une bonne pratique pour créer des sous-domaines?


J'essaie de créer des sous-domaines avec mon application Web. Cependant, je n'ai pas beaucoup d'expérience dans nginx, j'ai essayé de trouver une solution stable à partir de SF, mais malheureusement, je ne trouve pas de bonne solution.

Le problème que j'essaie de faire est de créer des sous-domaines flexibles, par exemple si j'ai un sous-domaine tel que dev.example.com il devrait aller le long du répertoire de fichiers de /var/www/example.com/www/dev, et n’importe quel type de sous-domaine (à l’exception du WWW) tentera de trouver un répertoire, s’il existe, faites-le en tant que racine.

/var/www/example.com/www/{subdomain}

Est-ce que le répertoire courant à rechercher, s'il n'existe pas, la racine par défaut serait:

/var/www/example.com/www/

C'est mon sites-enabled fichier de configuration pour mon domaine.

server {

    server_name     example.com www.example.com;
    root            /var/www/example.com/www;
    index           index.php index.htm index.html;
    error_page      404 /404.html;
    error_page      500 502 503 504  /50x.html;

    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    error_page 404 /index.php;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name;
        include fastcgi_params;
    }

    location /pma {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;
    }

    location /dev {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;
    }

    location ~ /\.ht
    {
        deny all;
    }
}

server {

    server_name     pma.example.com;
    index           index.php;
    root            /var/www/example.com/www/pma;

    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;
    }
}

server {

    server_name     dev.example.com;
    index           index.php;
    root            /var/www/example.com/www/dev;

    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;

        if ($request_uri ~* ^(/home(/index)?|/index(.php)?)/?$)
        {
            rewrite ^(.*)$ / permanent;
        }

        if ($host ~* ^www\.(.*))
        {
            set $host_without_www $1;
            rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
        }

        if ($request_uri ~* index/?$)
        {
            rewrite ^/(.*)/index/?$ /$1 permanent;
        }

        if (!-d $request_filename)
        {
            rewrite ^/(.+)/$ /$1 permanent;
        }

        if ($request_uri ~* ^/system)
        {
            rewrite ^/(.*)$ /index.php?/$1 last;
            break;
        }

        if (!-e $request_filename)
        {
            rewrite ^/(.*)$ /index.php?/$1 last;
            break;
        }
    }

    location ~ /\.ht
    {
        deny all;
    }
}

MODIFIER: Fichier de configuration mis à jour:

server {

    #regex capture assigning the subdomain to $subdomain
    server_name ~^(?<subdomain>.+)\.example\.com$;

    if ($host ~* ^www\.(.*)) {
        set $remove_www $1;
        rewrite ^(.*)$ http://$remove_www$1 permanent;
    }

    #if the directory doesn't exist, redirect to the main site
    if (!-d /var/www/example.com/www/$subdomain) {
        rewrite . example.com redirect;
    }

    #if we have made it here, set the root to the above directory
    root /var/www/example.com/www/$subdomain;

    #the rest of your config
    index           index.php;
    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/$subdomain$fastcgi_script_name;
        include fastcgi_params;
    }

    # this needs to be enabled for dev.example.com and pma.example.com only
    location / {
        auth_basic            "Authentication Required";
        auth_basic_user_file  /var/www/example.com/$subdomain/authfile;
    }

    location ~ /\.ht{
        deny all;
    }
}

5
2017-11-21 03:48


origine


Vous pouvez créer des "sous-domaines flexibles" à l'aide de captures de regex nommées dans votre nom de serveur, mais uniquement si les sous-domaines sont configurés de la même manière (c'est-à-dire que seuls quelques chemins changent). Si vous avez des règles très différentes pour chaque sous-domaine (par exemple, vos sous-domaines dev et pma ont des réécritures différentes), vous devrez noter les différences manuellement. Pensez également à placer vos sous-domaines au-dessus de votre racine Web principale. nom_serveur ~ ^ (? <sous-domaine>. +) \. domaine \ .com $; if (! -d /var/www/domain.com/subdomains/$subdomain/www) {rewrite. domain.com redirect;} root /var/www/domain.com/subdomains/$subdomain/www; - cyberx86
Vous pouvez en faire une réponse, il est plus facile à lire et à comprendre en même temps. - Lewis
Eh bien, je le pensais plutôt comme une suggestion pour une implémentation possible, étant donné que je ne savais pas à quel point vos sous-domaines seraient différents (ou à quel point leur création serait automatisée). J'ai ajouté un peu plus de détails dans ma réponse. - cyberx86


Réponses:


Si vous recherchez des sous-domaines automatiques, basés sur un modèle standard (par exemple, un sous-domaine pour chaque utilisateur), vous pouvez utiliser des captures d'expressions régulières dans votre directive nom_serveur. Cette approche vous permettra d’affecter une partie du nom_serveur à une variable à utiliser ailleurs dans votre configuration (par exemple, pour définir un chemin).

Il est généralement judicieux de placer les "vrais" sous-domaines au-dessus de la racine Web, afin de mieux séparer les sites (ce qui présente l'avantage d'empêcher l'accès via le site principal) et d'éviter toute ambiguïté sur le fait qu'un répertoire mappe ou non sur un répertoire. sous-domaine ou non. Par exemple, considérons le chemin suivant pour la racine de votre sous-domaine 'dev': /var/www/example.com/subdomains/dev/www. Cela vous permettrait également de gérer des journaux distincts pour votre site dev, par exemple. /var/www/example.com/subdomains/dev/logs).

L'exemple ci-dessous utilise votre sous-domaine pma comme modèle et conserve la racine du sous-domaine sous le site principal.

server{
    #regex capture assigning the subdomain to $subdomain
    server_name ~^(?<subdomain>.+)\.example\.com$;

    #if the directory doesn't exist, redirect to the main site
    if (!-d /var/www/example.com/www/$subdomain) {
        rewrite . example.com redirect;
    }

    #if we have made it here, set the root to the above directory
    root /var/www/example.com/www/$subdomain;

    #the rest of your config
    index           index.php;
    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/domain.com/$subdomain$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        auth_basic            "Authentication Required";
        auth_basic_user_file  /var/www/example.com/$subdomain/authfile;
    }

    location ~ /\.ht{
        deny all;
    }

}

L'idée ci-dessus ne fonctionne vraiment que si tous les sous-domaines doivent suivre le même modèle. Dans la configuration que vous avez postée, le sous-domaine pma et le sous-domaine dev sont substantiellement différents (en ce sens que le sous-domaine dev comporte beaucoup de réécritures que le pma ne contient pas). Tous les sous-domaines qui ne suivent pas le "modèle" que vous utilisez auront besoin de leurs propres bloc serveur et configuration. Il convient de noter que dans le cas où deux blocs de serveur sont applicables (par exemple, un avec un nom de serveur statique et un avec un nom de serveur regex), le nom de serveur statique aura la priorité.


1
2017-11-21 13:14



Mais je dois avoir plusieurs sous-domaines, je ne pourrai pas mettre dev et pma dans le même temps? - Lewis
Tous les blocs de serveur avec un nom de serveur statique (c’est-à-dire explicitement indiqué) auront la priorité sur la regex. Vous pouvez donc utiliser l'exemple ci-dessus pour vos sous-domaines "automatiques" et créer des blocs de serveur supplémentaires pour vos sous-domaines dev et pma. - cyberx86
D'accord ... J'ai eu une erreur en essayant de redémarrer nginx: Restarting nginx: nginx: [emerg] pcre_compile() failed: unrecognized character after (? or (?- in "^(?dev.+)\.domain\.com$" at "dev.+)\.domain\.com$" in /etc/nginx/sites-enabled/domain.com:4. - Lewis
Ne mettez pas vos sous-domaines statiques dans des expressions régulières. Il suffit de les garder comme server_name dev.domain.com; pour ceux. Essentiellement, ajoutez le bloc de serveur ci-dessus à votre configuration d'origine. L'exemple que j'ai posté consiste à capturer un sous-domaine inconnu / arbitraire - un domaine dans lequel vous ne connaissez pas le sous-domaine au moment de la configuration de nginx. Il déterminera le sous-domaine correspondant à partir du modèle et lui affectera une variable. - cyberx86
D'accord, je veux seulement dev et pma d'avoir l'authentification, alors que la racine domain.com ne pas avoir d'authentification ni d'autres sous-domaines, comment puis-je faire cela? - Lewis