【问题标题】:How to let PHP to create subdomain automatically for each user?如何让 PHP 为每个用户自动创建子域?
【发布时间】:2010-09-16 02:00:41
【问题描述】:

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

对于那些回答的人:那么,我应该问我的主机是否提供某种 DNS 访问??

【问题讨论】:

  • 也许不需要向您的提供商询问 DNS 访问权限,因为子域路由(Mark 的答案)已经激活!如果子域给您一个结果,只需在您的浏览器中尝试。然后使用 .htaccess 文件路由它们。
  • 如果你可以使用wildcard subdomains这可以在.htaccess中实现。查看我的解决方案。

标签: php subdomain


【解决方案1】:

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

但是,您实际上并不需要任何重写规则。 HTTP_HOST 标头在 PHP 中也可用,因此您已经可以获取它,例如

$username = strtok($_SERVER['HTTP_HOST'], ".");

【讨论】:

  • 除非每个子域都由不同的服务器提供服务,否则创建规范名称 (CNAME) 记录将是一个更好的计划。 en.wikipedia.org/wiki/List_of_DNS_record_types
  • 子域看起来不错。但是,设置起来会做很多工作,因为您必须确保所有子域请求都得到正确处理。这对 Apache 来说并不可怕,但在托管环境中可能会很棘手。
  • @theraccoonbear 假设您也可以在 CNAME 中使用通配符,这是一个想法。
  • 我应该更具体一些。 .htaccess 适用于 Apache,而不是 IIS。我不确定如何使用 IIS 处理 url 重写,但我相信在 SO 上有一些关于那里的问题。
  • 嗨,马克,我按照您上面给出的步骤进行操作,但是当我执行xyz.mydomain.com 时,它会重定向到xyz.mydomain.com/cgi-sys/defaultwebpage.cgi...除了上述步骤之外,我还需要做其他事情吗?
【解决方案2】:

您所追求的功能称为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 中设置。

【讨论】:

  • 我无法访问 httpd.conf 文件,因为我在共享主机上。我该怎么办?
【解决方案3】:

我做的和马克有点不同。我通过整个域并在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 代码中,我只是将我的用户名从主机名中分离出来。这给了我漂亮漂亮的 SEO URL。

【讨论】:

    【解决方案4】:

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

    那么实际上所有的子域都去同一个地方,但是PHP把每个子域都当作不同的账户。

    我们使用以下代码:

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

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

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

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

    【讨论】:

    • 我认为这应该是正确的答案,因为操作询问 PHP 如何处理子域而不是 web 或 DNS 服务器 如何处理子域。
    【解决方案5】:

    当您可以使用 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。

    【讨论】:

    • 我不太确定如何使用它.. 最后,为什么不搞乱 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 
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

        更新:是的,我会与您的注册商核实他们是否也提供名称服务器服务(通常是这种情况)。我以前从未探索过这个选项,但我怀疑大多数消费者注册商都没有。我在 Google 上搜索了 GoDaddy API 和 GoDaddy DNS API,但无法打开任何东西,所以我想最好的选择是查看您的提供商的在线帮助,如果这不能回答问题,请稍等他们的支持人员。

        【讨论】:

          【解决方案9】:

          这可以在.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】:

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

            【讨论】:

              【解决方案11】:

              使用 PHP 和 Htaccess 创建动态子域

              (1) 根目录.htaccess

              此文件重定向http://www.yourwebsite.comhttp://yourwebsite.com 以供主页使用。所有子域重定向到你的网站文件夹

              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

              此文件正在重写子域 url。

              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
              

              【讨论】:

                猜你喜欢
                • 2010-12-20
                • 2014-04-14
                • 1970-01-01
                • 2023-01-19
                • 2013-02-09
                • 1970-01-01
                • 1970-01-01
                • 2017-03-30
                • 2017-05-30
                相关资源
                最近更新 更多