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


162

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

对那些回答的人:那么,我应该问我的托管服务商是否提供某种DNS访问?


也许不需要要求您的提供商进行DNS访问,因为已经激活了子域路由(Mark的答案)!如果子域为您提供了结果,则只需在浏览器中尝试即可。然后使用.htaccess文件路由它们。
powtac

如果可以使用,wildcard subdomains可以在中实现.htaccess。请参阅我的解决方案。
丹·布雷

Answers:


135

您要创建自定义A记录

我很确定您可以在指定A记录时使用通配符,从而使您可以执行以下操作:

*.mywebsite.com       IN  A       127.0.0.1

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


如果可以的话,像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

1
除非每个子域都由不同的服务器提供服务,否则创建Canonical Name(CNAME)记录将是一个更好的计划。 en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear

子域确实不错。但是,由于需要确保所有子域请求都得到正确处理,因此需要进行更多的设置。这对于Apache来说并不可怕,但在托管环境中可能会有些棘手。
Mark Biek

@theraccoonbear假设您也可以在CNAME中使用通配符,这是一个想法。
Mark Biek

3
我应该更具体一些。.htaccess适用于Apache,而不适用于IIS。我不确定IIS如何处理url重写,但是我相信SO上存在一些问题。
Mark Biek

1
您好标记,我按照您上面提供的步骤进行操作,但是当我执行xyz.mydomain.com时,它会重定向到xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ...是否需要执行上述步骤之外的其他任何操作? ?
Ashish Rajan

30

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

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

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


由于我在共享主机上,因此无法访问httpd.conf文件。我能做什么?
Webber Depor

23

我的做法与Mark有所不同。我通过整个域并在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爆炸了。这给了我漂亮的SEO URL。


14

我们按照上面的说明设置通配符DNS。所以记录是* .yourname.com

然后,所有子域实际上都将移至同一位置,但是PHP将每个子域视为不同的帐户。

我们使用以下代码:

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

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

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

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


2
我认为这是一个正确的答案,正如op询问的有关PHP如何处理subdmoins的问题,而不是Web或DNS Server如何处理 子域的问题。
塞勒姆2016年

8

当您可以使用Apache Mass Virtual Hosting时,请不要大惊小怪。

从文档中:

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

在某种程度上,这与您的问题相反:每个“子域”都是一个用户。如果该用户不存在,则会收到404。

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


1
我不太确定如何使用它。.最后,为什么不搞乱htaccess?
斯库塔

6

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

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

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

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

?>

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

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

如果在不同的域上需要相同的昵称,则在注册登录时可能需要存储用户选择的域。

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

4

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


4

除了在WWW服务器上进行配置更改以处理新的子域之外,您的代码还需要对DNS记录进行更改。因此,除非您运行自己的BIND(或类似的产品),否则您将需要弄清楚如何访问名称服务器提供商的配置。如果他们不提供某种API,这可能会很棘手。

更新:是的,我会咨询您的注册商是否也提供名称服务器服务(通常是这样)。我以前从未探讨过此选项,但我怀疑大多数消费者注册商都不会这样做。我用Google搜索了GoDaddy API和GoDaddy DNS API,但是无法打开任何东西,所以我猜最好的选择是与您的提供商联系以获得联机帮助,如果仍然不能解决问题,请稍候他们的支持人员。


3

首先,您需要确保将服务器配置为允许通配符子域。我在JustHost中通过创建一个手动命名为的subomain实现了这一目标*。我还指定了一个文件夹,称为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]

最后,您要做的就是在subdomains文件夹中创建一个文件夹,然后将子域的文件放在该目录中。


3

.htaccess只要将服务器配置为允许通配符子域,就可以实现此目的。我在JustHost中通过创建一个手动命名的subomain *并指定了一个名为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]

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


1

我只是想补充一下,如果您使用CloudFlare(免费),则可以使用其API轻松管理您的dns。


0

使用PHP和Htaccess创建动态子域

(1)根.htaccess

此文件是从http://www.yourwebsite.com重定向到http://yourwebsite.com进行主页使用的。所有子域重定向到yourwebsite_folder

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2)内建.htaccess资料夹

该文件正在重写子域网址。

http://yourwebsite.com/index.php?siteName=9 http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

.htaccess的更多提示:Htaccess文件教程和提示。

index.php

该文件包含简单的PHP代码,使用正则表达式验证子域值。

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

没有子域文件夹

如果将根目录(htdocs / public_html)用作项目目录,请使用以下.htaccess文件。

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.