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

Sku*_*uta 156 php subdomain

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

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

Mar*_*iek 131

您正在寻找创建自定义A记录.

我很确定在指定A记录时可以使用通配符,这样可以让你做到这样的事情:

*.mywebsite.com       IN  A       127.0.0.1
Run Code Online (Sandbox Code Playgroud)

127.0.0.1将是您的网络服务器的IP地址.实际添加记录的方法取决于您的主机.


http://mywebsite.com/user这样做可以更容易设置,如果它是一个选项.

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

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1
Run Code Online (Sandbox Code Playgroud)

在上文中,用户名限于字符az


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

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

  • 我应该更具体一点..htaccess用于Apache,而不是IIS.我不确定如何使用IIS处理URL重写,但我相信在SO上有一些问题. (3认同)

bal*_*ton 29

您所追求的功能称为通配符子域.它允许您不必为每个子域设置DNS,而是使用apache重写进行重定向.你可以在这里找到一个很好的教程,但有成千上万的教程.以下是该教程中的必要代码:

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

但是,由于需要使用VirtualHosts,因此必须在服务器的httpd.conf文件中设置,而不是本地.htaccess.


gra*_*bot 23

我和马克有点不同.我传递整个域并在php中获取子域.

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

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

http://fred.mywebsite.com/album/Dance/now
Run Code Online (Sandbox Code Playgroud)

我回来了

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com
Run Code Online (Sandbox Code Playgroud)

然后在我的index.php代码中,我只是从hostName中删除了我的用户名.这给了我漂亮的SEO网址.


小智 14

我们像上面解释的那样设置了通配符DNS.所以记录是*.yourname.com

然后,所有子域实际上都会转到同一个地方,但PHP会将每个子域视为不同的帐户.

我们使用以下代码:

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);
Run Code Online (Sandbox Code Playgroud)

此代码只是将$account变量设置为与子域相同.然后,您可以根据其帐户检索其文件和其他信息.

这可能不如上面列出的方式有效,但是如果您无法访问BIND和/或限制.htaccess,则此方法应该有效(只要主机为您设置通配符).

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

  • 我认为这应该是当前的答案,因为op询问**PHP**如何处理子数字NOT如何web或DNS**服务器**handel子域. (2认同)

Wil*_*lem 8

当你可以使用Apache群发虚拟主机时,不要大惊小怪.htaccess文件.

从文档:

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

在某种程度上,它与您的问题相反:每个"子域"都是用户.如果用户不存在,则会获得404.

唯一的缺点是环境变量DOCUMENT_ROOT未正确设置为used子目录,而是de htconfig中的默认document_root.


Ale*_*ich 6

适用于子域和多域Web应用程序的简单PHP解决方案

步骤1.为您要服务的域(或域)提供DNS A记录"*""example.org"

A record => *.example.org
A record => *.example.net
Run Code Online (Sandbox Code Playgroud)

步骤2.在用户注册或更改登录时检查登录的单一性.此外,请避免这些登录中的点.

步骤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
        }

?>
Run Code Online (Sandbox Code Playgroud)

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

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com
Run Code Online (Sandbox Code Playgroud)

如果您在不同的域上需要相同的缺口,则可能需要在注册登录时存储用户对域的选择.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 
Run Code Online (Sandbox Code Playgroud)