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

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

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

144751 次浏览

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

更新: 是的,我会与您的注册商检查,如果他们也提供名称服务器服务(通常情况下)。我以前从未探索过这个选项,但我怀疑大多数消费者注册机构都没有。我在谷歌上搜索了 GoDaddy API 和 GoDaddy DNS API,但是没有找到任何东西,所以我想最好的选择是查看你的提供商的在线帮助,如果这不能回答这个问题,联系他们的支持人员。

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

您要创建一个自定义 一张唱片

我非常确定,在指定 A 记录时,您可以使用通配符,这样就可以执行以下操作:

*.mywebsite.example       IN  A       127.0.0.1

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


然后,您需要配置您的网络服务器,以服务所有子域名。

  • server_name .mywebsite.example
  • 阿帕奇: ServerAlias *.mywebsite.example

关于。Htaccess,你不需要任何重写规则。HTTP_HOST头文件在 PHP 中也是可用的,因此您可以使用它,比如

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

如果您不能访问 DNS/web-server 配置,那么如果可以选择使用 http://mywebsite.example/user,那么设置起来会容易得多。

我的做法与 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.example/album/Dance/now

我回来了

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

然后在我的 index.php代码中,我只是从 hostName 中爆炸我的用户名。这给了我漂亮的搜索引擎优化网址。

当您可以使用[ Apache 大规模虚拟主机][1]时,不要对 .htaccess文件大惊小怪。

根据文件:

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

在某种程度上,这与你的问题正好相反: 每个“子域名”都是一个用户。如果用户不存在,您将得到一个404。

唯一的缺点是没有正确地将环境变量 DOCUMENT_ROOT设置为 用过子目录,而是设置为 de htconfig 中的默认 document _ root。 Http://httpd.apache.org/docs/2.0/vhosts/mass.html

我们设置通配符 DNS,就像他们上面解释的那样。所以记录是 *.yourname.example

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

我们使用以下代码:

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

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

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

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

您所追求的特性称为 通配符子域。它允许您不必为每个子域设置 DNS,而是使用 Apache 重写进行重定向。你可以找到一个很好的教程 给你,但有数以千计的教程在那里。下面是该教程中的必要代码:

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

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

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

简单的 PHP 解决方案的子域和多域网络应用程序

第一步。提供域名服务器记录为“ *”为域(或域)你要服务 example.org

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

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

步骤3。然后检查查询 < ? php

        // 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.example
paulsmith.somecompany.example

如果你需要在不同的领域有不同的划痕, 注册登录时,您可能需要存储用户选择的域名。

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

如果您的服务器配置为允许通配符子域,那么可以在 .htaccess中实现这一点。在 JustHost 中,我通过手动创建一个名为 *的子域,并指定一个名为子域的文件夹作为通配符子域的文档根来实现这一点。把这个添加到你的 .htaccess文件:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.example$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.example$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

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

使用 PHP 和 .htaccess创建动态子域

# (1)根 .htaccess 这个文件是重定向 http://www.yourwebsite.examplehttp://yourwebsite.example的主页使用。所有的子域重定向到你的网站 _ 文件夹

RewriteEngine On


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


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


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

# (2)文件夹内 .htaccess 此文件正在重写子域 URL。

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

Options +FollowSymLinks
RewriteEngine On


RewriteBase /


RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.example
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.example/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.example
RewriteRule (.*) http://yourwebsite.example/$1 [R=301,L]


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

您可以通过两个步骤来实现这一点。

  1. 设置通配符子域
  2. 获取用户输入的子域
  3. 验证子域

1. 设置通配符子域

这可能因托管服务提供商而异 creating a sub domain in namecheap

  • 去 cPanel
  • 进入子域名
  • 输入“ *”作为子域的值

现在,每次在域名之前输入一个随机字符串时,它都会直接指向通配符子域。您可以修改此通配符子域的内容。

2. 获取用户输入的子域

现在可以在文件管理器的通配符目录中添加一个 php 文件。

<?php
    

$link = $_SERVER['HTTP_HOST'];
$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>


<!DOCTYPE html>
<html lang="en">
    

<head>
      

<title>Wildcard Subdomain</title>
    

</head>
  

<body>
<h1>The visitor went to
<?php
        

echo "<br>";
        

print("link is: ".$link);
        

print("<br><br>");
        

echo "actual file: ".$actual_link;
?>
</h1>
        

</body>
</html>

3. 验证子域

您可能需要验证子域,以检查是否有一些用户链接到它。这可以通过检查数据库来完成。