171

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

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

4

11 回答 11

144

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

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

$username = strtok($_SERVER['HTTP_HOST'], ".");
于 2008-10-08T17:49:38.540 回答
35

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

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

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

于 2010-09-01T11:22:17.587 回答
23

我做的和马克有点不同。我传递整个域并在 php.ini 中获取子域。

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。

于 2008-10-08T18:39:01.093 回答
16

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

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

我们使用以下代码:

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

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

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

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

于 2009-03-02T15:12:17.457 回答
8

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

从文档中:

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

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

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

于 2008-10-08T23:02:46.723 回答
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 
于 2014-12-23T19:55:07.697 回答
4

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

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

于 2008-10-08T17:40:01.057 回答
4

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

于 2008-10-08T17:40:48.170 回答
4

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

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

于 2016-04-06T18:51:11.207 回答
1

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

于 2014-08-13T10:40:31.057 回答
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

此文件正在重写子域 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 文件教程和提示。

索引.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
于 2019-11-06T13:05:55.753 回答