如何让PHP为每个用户自动创build子域?

如何创build像http://user.mywebsite.com这样的子域名? 我必须以某种方式访问​​htaccess吗? 它实际上可以通过纯PHP代码创build它,或者我需要使用一些外部脚本 – 服务器端语言?

对于那些回答:那么,我应该问我的主机,如果他们提供某种DNS访问?

您正在寻找创build一个自定义的Alogging

我很确定你可以在指定Alogging的时候使用通配符来让你做这样的事情:

 *.mywebsite.com IN A 127.0.0.1 

127.0.0.1将是您的networking服务器的IP地址。 实际添加logging的方法将取决于您的主机。


http://mywebsite.com/user一样做,如果它是一个选项,将会更容易设置。;

然后你可以添加一个如下所示的.htaccess文件:

 Options +FollowSymLinks RewriteEngine On RewriteRule ^([aA-zZ])$ dostuff.php?username=$1 

在上面,用户名被限制为字符az


抓取子域的重写规则如下所示:

 RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com RewriteRule (.*) dostuff.php?username=%1 

您之后的function称为通配符子域 。 它允许你不必为每个子域设置DNS,而是使用Apache重写的redirect。 你可以在这里find一个很好的教程,但是那里有数以千计的教程。 以下是该教程的必要代码:

 <VirtualHost 111.22.33.55> DocumentRoot /www/subdomain ServerName www.domain.tld ServerAlias *.domain.tld </VirtualHost> 

但是,因为它需要使用VirtualHosts,所以必须在服务器的httpd.conf文件中设置,而不是本地的.htaccess。

我和马克有点不同。 我传递整个域名,并在PHP中获取子域名。

 RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST} 

这会忽略图像并将其他所有内容映射到我的index.php文件。 所以,如果我去

 http://fred.mywebsite.com/album/Dance/now 

我回来了

 http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com 

然后在我的index.php代码我只是爆炸我的用户名hostname。 这给了我漂亮的SEOurl。

我们像上面解释的那样设置通配符DNS。 所以一个logging是* .yourname.com

然后,所有的子域实际上是去相同的地方,但PHP把每个子域作为一个不同的帐户。

我们使用下面的代码:

 $url=$_SERVER["REQUEST_URI"]; $account=str_replace(".yourdomain.com","",$url); 

这段代码只是将$accountvariables设置为与子域相同。 然后,您可以根据他们的帐户检索他们的文件和其他信息。

这可能不像上面列出的那样有效,但是如果你不能访问BIND和/或有限的.htaccess,这个方法应该可行(只要你的主机会为你设置通配符)。

我们实际上使用这种方法连接到多公司电子商务应用程序的客户数据库,但它也可能适用于您。

当您可以使用Apache大容量虚拟主机时,不要使用.htaccess文件。

从文档:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

在某种程度上,这是你的问题的反面:每个“子域”是一个用户。 如果用户不存在,你会得到一个404。

唯一的缺点是环境variablesDOCUMENT_ROOT没有正确设置为已使用的子目录,而是de htconfig中的默认document_root。

简单的PHP解决scheme的子域和多域的networking应用程序

第1步。提供DNSlogging为“*”的域(或域),你会服务“example.org”

 A record => *.example.org A record => *.example.net 

步骤2.检查用户注册或更改login时login的唯一性。 另外,避免在这些login点。

第3步然后检查查询

  // Request was http://qwerty.example.org $q = explode('.', $_SERVER['HTTP_HOST']); /* We get following array Array ( [0] => qwerty [1] => example [2] => org ) */ // Step 4. // If second piece of array exists, request was for // SUBDOMAIN which is stored in zero-piece $q[0] // otherwise it was for DOMAIN if(isset($q[2])) { // Find stuff in database for login $q[0] or here it is "qwerty" // Use $q[1] to check which domain is asked if u serve multiple domains } ?> 

该解决scheme可以服务于不同的域

 qwerty.example.org qwerty.example.net johnsmith.somecompany.com paulsmith.somecompany.com 

如果您需要在不同的服务域上使用相同的刻度,则可能需要在注册login时将用户select存储在域中。

 smith.example.org // Show info about John Smith smith.example.net // Show info about Paul Smith 

您可以[可能]重写URL,但是:您必须控制您的DNS设置,以便在添加用户时获取其自己的子域。

除了WWW服务器上的configuration更改来处理新的子域名,您的代码需要更改您的DNSlogging。 所以,除非你运行你自己的BIND(或类似的),否则你需要弄清楚如何访问你的名字服务器提供者的configuration。 如果他们不提供某种API,这可能会变得棘手。

更新:是的,我会检查您的注册商是否也提供名称服务器服务(通常情况下)。 我从来没有探讨过这个select,但我怀疑大多数消费者注册商不这样做。 我searchGoDaddy的API和GoDaddy的DNS API,但无法打开任何东西,所以我想最好的select是检查你的提供商的在线帮助,如果没有回答这个问题,的支持人员。

首先,您需要确保您的服务器已configuration为允许通配符子域名。 我通过手动创build一个名为*的子域来实现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] 

最后,你需要做的只是在你的子域文件夹中创build一个文件夹,然后把子域的文件放在那个目录下。

这可以通过.htaccess来实现,只要你的服务器被configuration为允许通配符子域名。 我在JustHost中创build了一个名为*子域,并将一个名为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] 

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

我只是想补充一点,如果你使用CloudFlare(免费),你可以使用他们的API轻松pipe理你的dns。