在PHP中重定向子域和域的标准情况

时间:2012-03-29 13:34:28

标签: php dns subdomain cpanel server-configuration

专家!

我会解释我想做什么。如果有人可以提供帮助,请提出一些建议。

我有一个网站,我们称之为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

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

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

    我想我已经试着解释我想做什么了。上帝,很难解释这种情况。啊,忘了提,我想在PHP上做这一切。

2 个答案:

答案 0 :(得分: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数字,可能没有必要。在这种情况下,我会将point(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;

答案 1 :(得分:1)

如果实际上只有一个(或几个)微小的设置在子域之间不同,您应该考虑提供来自同一文档/ Web根目录的所有子域。通过调整vhost配置来执行此操作。在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放入你的vhost配置中,那么仍然有一种简单的方法可以使事情以类似的方式工作:对文档/ web根使用符号链接。

因此,如果myname.mysite.com的文档/ web根目录为/var/www/websites/myname.mysite.com,则mysite.com的文档/ web根目录为/var/www/websites/mysite.com

然后将/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 is lame

如果您已经启用了mod_proxy,则可以在每个根.htaccess

中执行此操作
RewriteRule ^([^/]*)(/?)(.*) http://mysite.com/$1$2$3 [L,P]

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

我希望这给了你一些想法。看起来你需要做的事情超出了cPanel所能提供的功能,以便按照你想要的方式工作。