1

伙计们!

我会解释我想做什么。如果有人可以帮助解决这个问题,请给一些建议。

我有一个网站,我们称之为http://mysite.com。和子域,比如说http://myname.mysite.com

有一个配置文件 inc.php,其中包含 mysite.com 和 myname.mysite.com 的一些个人数据,例如 ICQ 编号。位于 mysite.com 目录中的所有通用网站文件。

我希望能够在子域 myname.mysite.com 中创建 mysite.com 的所有常规文件,以免在子域中创建完全相似的文件。但包括位于 myname.mysite.com 的个人配置文件,其中包含个人 ICQ 编号。

这是我希望它如何工作的示例:

  1. 主域“mysite.com”具有根文件夹“public_html”,其中包含以下页面:index.php、about.php、articles.php 和配置文件 inc.php,icq 编号为“111-111”。因此,当服务“mysite.com”网站时,您会看到来自 inc.php 的 ICQ 编号。

  2. 子域“myname.mysite.com”的文件夹“public_html/subdomain/myname”只有一个配置文件 inc.php,ICQ 编号为“222-222”。因此,当您访问 myname.mysite.com 时,您将看到来自“mysite.com”的网页,但 ICQ 编号将从此处获得“public_html/subdomain/myname/inc.php”。在地址栏中,您会看到以下网页: http://myname.mysite.com/index.php http://myname.mysite.com/about.php http://myname.mysite.com/articles.php

因此,访问者会认为他们在为个别网站 myname.mysite.com 提供服务,但实际上,访问者将在 mysite.com 网页上提供服务。因此,如果我更改 mysite.com 上的内容,该内容将在 myname.mysite.com 上更改。

我需要所有这些员工,因为我想组织会员计划,为我的合作伙伴提供个人子域名,但使用个人配置文件 inc.php,这将使用 ICQ 号码进行咨询。

我想我已经试图解释我想要做什么。上帝,请努力解释这种情况。啊,忘了提,我想在 PHP 上做的这一切。

4

2 回答 2

1

如果真的只有一个(或几个)微小的设置在子域之间是不同的,那么您可能应该考虑从同一个文档/Web 根目录提供所有子域。通过调整您的虚拟主机配置来做到这一点。在 Apache 中,它看起来像这样(假设NameVirtualHost *:80):

<VirtualHost *:80>
  ServerName mysite.com
  ServerAlias *.mysite.com
  DocumentRoot /var/www/websites/mysite
</VirtualHost>

然后在您的代码中,您可以使用子域确定要使用(或覆盖)哪些设置,这可能是这样确定的:

$domain = !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
$subdomain = implode('.', explode('.', $domain, -2));

然后使用$subdomain确定要使用的设置。

我不会提供示例代码来说明您如何确定在给定子域的情况下使用哪些设置,因为您的实现选择对您的需求非常主观。


编辑 - 在第一条评论中回答 OP 的问题

如果您绝对不能放入ServerAlias *.mysite.com您的虚拟主机配置,那么可能仍然有一种简单的方法可以让事情以类似方式工作:使用符号链接作为文档/网络根目录。

因此,如果 myname.mysite.com 具有 /var/www/websites/myname.mysite.com 的文档/Web 根目录,而 mysite.com 具有 /var/www/websites/mysite.com 的文档/Web 根目录

然后使 /var/www/websites/myname.mysite.com 成为 Web 服务器上 /var/www/websites/mysite.com 的符号链接:

cd /var/www/websites/
ln -s mysite.com myname.mysite.com

这应该会导致 Apache 为 myname.mysite.com 使用/提供的文件来自服务器上与 mysite.com 相同的位置。


编辑 - 用于 cPanel

好的,我现在确信cPanel 是 lame

如果您已经启用了 mod_proxy,您可以在每个根 .htaccess 中执行此操作

RewriteRule ^([^/]*)(/?)(.*) http://mysite.com/$1$2$3 [L,P]

当然,这甚至不考虑通过 https 进来的请求。您可以通过将所有请求定向到 myname.mysite.com 的 web/文档根目录中的符号链接来避免使用 mod_proxy,但这让我们回到了创建符号链接的问题。在文档/Web 根目录中获取符号链接可能比让文档/Web 根目录符号链接本身更容易。

我希望这给了你一些想法。似乎您需要做一些超出 cPanel 提供的操作才能让事情按您希望的方式工作。

于 2012-03-29T14:19:04.323 回答
1

如果您只想更改inc.php文件,我建议您对其进行稍微不同的结构(下面的代码假设只有 1 级子域,例如 subdomain.mysite.com,并且第 (3) 和 (4) 点中的一些修改将需要更深的子域,例如 sub.subdomain.mysite.com)。

1) 在您的 apache 虚拟主机配置中,将所有子域定义为主域的别名:

<VirtualHost *:80>
    ...

    SernarName mysite.com
    ServerAlias *.mysite.com

    ...
</VirtualHost>

2) 将所有子域的所有 PHP 文件放在一个目录中,并将 apache 配置指向该目录。

3) 在该目录中,创建一堆inc文件:inc.phpinc-subdomain1.phpinc-subdomain2.php

4)拥有某种config.php文件,您可以从站点中的所有其他文件中包含该文件,并使其包含以下内容:

if(isset($_SERVER['HTTP_HOST'])) {
    $host = explode('.', strtolower($_SERVER['HTTP_HOST']));
    if(count($host) == 3) {   //have something more than just mysite.com
        $subdomain = $host[0];
        if($subdomain == 'www') {     //www.mysite.com is the same as just mysite.com
            $subdomain == '';
        }
    }
    else {      //if just mysite.com, then no subdomains
        $subdomain = '';
    }
}
else {  //if no http_host info exists, then assume it's just mysite.com
    $subdomain = '';
}

$incfile = 'inc' . ($subdomain == '' ? '' : "-$subdomain") . '.php';
if(!file_exists($incfile)) {    //if no include file for the requested subdomain, just use mysite.com
    $incfile = 'inc.php';
}

require_once($incfile);

现在,所有这些当然会给您很大的灵活性,但如果您只需要不同的 ICQ 号码,则可能没有必要。在这种情况下,我会将第 (4) 点代码更改为只有 1 个包含文件,例如inc.php,并且在该文件中具有如下内容:

$icq_default = '111-111';
$icq_nums = array('subdomain1' => '222-222',
                  'subdomain2' => '333-333',
                  ...);

if(isset($_SERVER['HTTP_HOST'])) {
    $host = explode('.', strtolower($_SERVER['HTTP_HOST']));
    if(count($host) == 3) {   //have something more than just mysite.com
        $subdomain = $host[0];
        if($subdomain == 'www') {     //www.mysite.com is the same as just mysite.com
            $subdomain == '';
        }
    }
    else {      //if just mysite.com, then no subdomains
        $subdomain = '';
    }
}
else {  //if no http_host info exists, then assume it's just mysite.com
    $subdomain = '';
}

$required_number = isset($icq_numbers[$subdomain]) ? $icq_numbers[$subdomain] : $icq_default;
于 2012-03-29T14:07:29.297 回答