使用一个Webroot并按ID

时间:2018-05-28 11:04:32

标签: php nginx get subdomain

我的任务是优化基于每个客户提供照片的网络服务。因此,客户A可以使用customerA.domain.com并在光滑的页面上呈现他自己的图像 目前,每个子域都植根于每个自己的Web根目录(具有相应的index.php等)。现在我要统一这些网站,以便只使用一个webroot,子域是决定使用哪组照片(按编号文件夹组织)的因素。这是为了保持网站的可扩展性和可变性。

为了实现这一点,我想到了以下需要满足的条件:

  • Nginx需要将一组有限的子域路由到同一个webroot
  • 根据子域,网页(PHP)必须知道特定于客户(子域)的数据库操作所需的预定义ID,并找到正确的图像目录。

我提出的部分(可能?)解决方案:

  • 将子域存储在DB中的customer表中,从HTTP头解析子域并从DB获取ID
  • 配置Nginx以将正确的ID附加到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参数前加上静态ID?如何将所有指定的子域名汇集到同一个webroot?

现在,完全有可能我只是做了错误的搜索查询,因为我没有找到解决方案(谷歌也不是SO)我的问题,我无法想象我是第一个有问题的人那种。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

以下是您提到的两种方式:

在这里,每个客户都有一个服务器块,必要时手动将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完成查找用户ID的工作。

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配置和开箱即用的客户增长。