动态子域 PHP

Posted

技术标签:

【中文标题】动态子域 PHP【英文标题】:Dynamic Subdomain PHP 【发布时间】:2011-04-27 22:55:35 【问题描述】:

好的,这可能以前已经回答过,但显然到目前为止我还没有找到答案。

您可能会注意到有些网站可能允许用户注册以立即在网站中获得自己的子域。

例如,域是 www.domain.com。 如果我将新用户注册为 henson,我将在网站中获得自己的页面,例如:www.henson.domain.com(不确定是否需要 www 部分) 所以如果用户打开 www.henson.domain.com,它实际上会打开 www.domain.com?owner=henson

我可以只使用 htaccess 吗?因为我在某处读到这也需要在 cpanel 中手动创建子域(这违背了网站的目的)。

哦,这个网站是用纯 php 编码的,所以没有 MVC 框架。如果有人知道如何使用框架(最好是 CodeIgniter)轻松做到这一点,欢迎回答。

感谢您的回答。

【问题讨论】:

看看这个***.com/questions/586129/… 查看我的解决方案。前提是你可以启用wildcard subdomains,这可以在.htaccess中实现。 【参考方案1】:

你不能在htaccess,你必须设置一个通配符虚拟主机并将它重写到你需要的 URL/目录。请参阅http://blog.orite.com.au/web_development/2009-01-22/setting-up-wildcard-virtual-hosts-for-web-development-environment/ 了解更多信息

【讨论】:

You cant in htaccess。实际上...corz.org/serv/tricks/htaccess2.php(查找“一个根中的多个域”)。 我读过,代码是这样的: VirtualDocumentRoot c:/projects/%1/ 我把这段代码放在哪里?在 htaccess 中? httpd.conf 或等效文件中(取决于系统)。 好的,如果我在我的本地主机中尝试。那么在托管方面呢?有些网站可以将购买的域名(例如购买的.com)链接到他们的主要网站。它是如何实现的? @passcod,实际上,你不能。仅当 Web 服务器已设置为将两个域映射到一个目录时,该方法才适用。【参考方案2】:

您可以解析$_SERVER['SERVER_NAME'] 以确定使用哪个子域。 www 部分实际上是没有必要的。这只是一个没有任何意义的子域。大多数情况下,它只是简单地映射到主域。示例:

if (preg_match('/^(www\.)?(.+)\.your-domain.com$/', $_SERVER['SERVER_NAME'], $matches) && $matches[2] != 'www') 
    $subdomain = $matches[2];
    // your logic goes here

【讨论】:

【参考方案3】:

如果您的服务器上有 CPANEL,则有一个 XMLAPI 允许您通过 PHP 动态创建子域。

是的,动态的,而不是手动的。我刚刚花了最后 2 天的时间(动态创建从子域到电子邮件帐户再到插件域和 sql dbs、用户......一切),并且 cpanel API 可以干净地处理这一切。所以花点时间弄清楚吧。

在此页面的第一个链接处下载 XMLAPI: http://forums.cpanel.net/f42/xml-api-php-class-version-1-0-a-136449.html。 xmlapi.php 文件是您服务器上唯一需要的文件。

该论坛页面是一个噩梦般的墓地,其中有一半工作示例由非常先进和/或非常 hacky 的编码人员编写,没有明确的起点。

这是一个基本的 PHP 脚本,用于添加子域,将大写字母替换为您的个人值。我花了很长时间才弄好。祝你好运!下一步,点击该论坛链接并阅读所有其他 API1 和 API2 函数!

include("PATH_TO_THE_DOWNLOADED_xmlapi.php");

    $ip = "YOUR_IP_ADDRESS";
$root_pass = "ROOT_CPANEL_PASSWORD!";


$xmlapi = new xmlapi($ip);
$xmlapi->password_auth("root",$root_pass);

$account = "YOUR_CPANEL_MAIN_ACCNT_NAME";


print $xmlapi->api2_query($account, 'SubDomain','addsubdomain', array(dir=>"public_html/NAME_OF_SUBDOMAIN", domain=>"NAME_OF_SUBDOMAIN", rootdomain=>"MAIN_DOMAIN.com") );

【讨论】:

【参考方案4】:

这可以在.htaccess 中实现,前提是您的服务器配置为允许通配符子域。我在 JustHost 中通过手动创建一个名为 * 的子域并指定一个名为 subdomains 的文件夹作为通配符子域的文档根目录来实现这一点。将此添加到子域文件夹中的 .htaccess 文件中:

RewriteEngine On
RewriteCond %HTTP_HOST !^www\.website\.com$
RewriteCond %HTTP_HOST ^(\w+)\.website\.com$
RewriteCond %REQUEST_URI:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

最后,为您的子域创建一个文件夹并放置子域文件。

【讨论】:

以上是关于动态子域 PHP的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 读取服务器上任何动态子域的内部 index.php

使用 .htaccess 重写动态子域

无法将某些特定子域用于 firebase 动态链接

内部子域到文件夹重定向

laravel 主域路由优先于动态子域

如何使用 .htaccess 在 codeigniter 中实现动态子域?