专家!
我会解释我想做什么。如果有人可以提供帮助,请提出一些建议。
我有一个网站,我们称之为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编号。
这是我希望如何工作的示例:
主域“mysite.com”的根文件夹“public_html”包含页面:index.php,about.php,articles.php和配置文件inc.php,其中icq编号为“111-111”。因此,在搜索“mysite.com”网站时,您会看到来自inc.php的ICQ编号。
子域“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上做这一切。
答案 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.php
,inc-subdomain1.php
,inc-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所能提供的功能,以便按照你想要的方式工作。