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

时间:2008-10-08 17:36:52

标签: php subdomain

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

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

12 个答案:

答案 0 :(得分:129)

您正在寻找创建自定义 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

在上文中,用户名仅限于字符a-z


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

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

答案 1 :(得分:29)

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

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

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

答案 2 :(得分:23)

我和马克有点不同。我传递整个域并在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网址。

答案 3 :(得分:14)

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

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

我们使用以下代码:

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

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

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

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

答案 4 :(得分:8)

当您可以使用Apache mass virtual hosting时,请勿使用.htaccess文件。

来自文档:

  

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

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

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

答案 5 :(得分:6)

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

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

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 

答案 6 :(得分:4)

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

更新:是的,如果他们还提供名称服务器服务,我会向您的注册商咨询(通常情况下)。我之前从未探索过此选项,但我怀疑大多数消费者注册商都没有。我用谷歌搜索GoDaddy API和GoDaddy DNS API,但无法解决任何问题,所以我想最好的选择是查看与您的提供商的在线帮助,如果这不能回答问题,请抓住他们的支持人员。

答案 7 :(得分:4)

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

答案 8 :(得分:3)

首先,您需要确保将服务器配置为允许通配符子域。我通过创建一个名为*的子域,在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]

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

答案 9 :(得分:2)

如果您的服务器配置为允许通配符子域,则可以在.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]

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

答案 10 :(得分:1)

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

答案 11 :(得分: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=9lessonshttp://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 File Tutorial and Tips.

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