题
如何创建子域 http://user.mywebsite.com ?我必须以某种方式访问 htaccess 吗?实际上是否可以通过纯 php 代码创建它,或者我需要使用一些外部脚本服务器端语言?
对于那些回答的人:那么,我应该询问我的主机是否提供某种 DNS 访问?
解决方案
您正在寻找创建自定义 一个记录.
我很确定您可以在指定 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
其他提示
我的做法与马克略有不同。我传递整个域并获取 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。
我们像上面解释的那样设置通配符 DNS。所以a记录是*.yourname.com
那么所有的子域实际上都会去同一个地方,但是 PHP 将每个子域视为不同的帐户。
我们使用以下代码:
$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);
这段代码只是设置 $account
变量与子域相同。然后,您可以根据他们的帐户检索他们的文件和其他信息。
这可能不如上面列出的方法那么有效,但如果您无权访问 BIND 和/或有限的 .htaccess,则此方法应该有效(只要您的主机将为您设置通配符)。
我们实际上使用此方法连接到多公司电子商务应用程序的客户数据库,但它也可能适合您。
当您可以使用时,不要对 .htaccess 文件大惊小怪 Apache 大规模虚拟主机.
从文档中:
#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs
在某种程度上,这与你的问题相反:每个“子域”都是一个用户。如果用户不存在,您会收到 404。
唯一的缺点是环境变量 DOCUMENT_ROOT
未正确设置为 用过的 子目录,但默认是 de htconfig 中的 document_root。
适用于子域和多域 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
您可以[可能]重写 URL,但是可以:您必须控制 DNS 设置,以便在添加用户时获得自己的子域。
除了更改 WWW 服务器上的配置以处理新的子域之外,您的代码还需要更改 DNS 记录。因此,除非您运行自己的 BIND(或类似的),否则您需要弄清楚如何访问名称服务器提供商的配置。如果他们不提供某种 API,这可能会变得棘手。
更新:是的,我会咨询您的注册商是否也提供名称服务器服务(通常是这种情况)。我以前从未探索过这个选项,但我怀疑大多数消费者注册商都没有探索过。我在 Google 上搜索了 GoDaddy API 和 GoDaddy DNS API,但无法找到任何结果,所以我想最好的选择是查看您的提供商的在线帮助,如果这不能回答问题,请稍候他们的支持人员。
首先,您需要确保您的服务器配置为允许通配符子域。我通过创建一个手动命名的子域在 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]
最后,您需要做的就是在子域文件夹中创建一个文件夹,然后将子域的文件放入该目录中。
这可以实现在 .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]
最后,为您的子域创建一个文件夹并放置子域文件。
我只是想补充一点,如果您使用 CloudFlare(免费),您可以使用他们的 API 轻松管理您的 dns。