Используйте один Webroot и различайте субдомены по ID - PullRequest
0 голосов
/ 28 мая 2018

Мне было поручено оптимизировать веб-сервис, который предоставляет фотографии для каждого клиента.Таким образом, клиент А может использовать customerA.domain.com и получать его собственные изображения на гладкой странице.В настоящее время каждый поддомен имеет корни в каждом собственном веб-корне (с соответствующим index.php и т. Д.).Теперь я должен объединить эти веб-сайты таким образом, чтобы использовался только один веб-корень, причем субдомен является решающим фактором, для которого следует использовать набор фотографий (организованных в пронумерованных папках).Это сделано для того, чтобы поддерживать расширяемость и изменчивость веб-сайта.

Чтобы это работало, я подумал о следующих условиях, которые необходимо выполнить:

  • Nginx необходимо перенаправить ограниченный набор поддоменов на один и тот же веб-корень
  • В зависимости от субдомена, веб-страница (PHP) должна знать заранее определенный идентификатор, необходимый для операций с базой данных, специфичных для клиента (субдомен)и нахождение правильного каталога изображений.

Частичные (возможные?) решения, которые я придумал:

  • Сохранение субдомена в клиентетаблицу в БД, проанализируйте поддомен из заголовка HTTP и получите идентификатор из БД
  • Настройте Nginx для добавления правильного идентификатора к URL (в качестве параметра GET)

Пример одного клиента конфиг nginx, довольно по умолчанию.

server {
    listen 80; ## listen for ipv4; this line is default and implied
    listen 443; ## listen for ipv4; this line is default and implied
    ssl on;

    ssl_certificate /mnt/www-cluster22/scripts/cert/2018/thedomain.crt;
    ssl_certificate_key /mnt/www-cluster22/scripts/cert/2018/privatekey.key;

    root /mnt/www-cluster22/foto_cms/32;
    index index.php index.html index.htm;
    server_name customerA.thedomain.com;
    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    access_log /var/log/nginx/customerA.access.log;
    error_log /var/log/nginx/customerA.error.log; 
}

Как бы я изменил конфигурацию nginx для добавления GET-параметра со статическим идентификатором, если это возможно?Как направить все указанные субдомены в один и тот же веб-корень?

Теперь вполне возможно, что я просто сделал неправильные поисковые запросы, поскольку не нашел решений (ни Google, ни SO) для своего вопроса,и я не могу себе представить, что у меня первая такая проблема.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 28 мая 2018

Вот как вы можете сделать это двумя способами, которые вы упомянули:

Здесь у вас будет блок сервера для каждого клиента, при необходимости вручную устанавливая переменную userid для каждого.

server {
    ...
    server_name customerA.thedomain.com;
    location ~ \.php$ {
        set $args $args&userid=123; # Here's how to append a GET variable
        ...
    }
    ...
}

PHP:

<?php

$user_id = $_GET['userid'];

?>

или

Здесь у вас будет один блок сервера для каждого клиента, и вам потребуется PHP, чтобы выяснить идентификатор пользователя.

server {
    ...
    server_name customerA.thedomain.com customerB.thedomain.com customerC.thedomain.com;
    ...
}

PHP:

<?php

$hostname = $_SERVER['HTTP_HOST'];
$customer = substr($hostname, 0, strpos($hostname, "."));

// Lookup the User ID for the $customer in the database

?>

Если у вас всего несколько поддоменов, первое, вероятно, лучше.В противном случае последний вариант был бы лучшим, чтобы не допустить наличия огромной конфигурации nginx и работать «из коробки» для роста клиентов.

...