如何从脚本构建子域

时间:2010-01-08 09:57:13

标签: php mod-rewrite

在我的项目中,我必须创建一个子域,即

如果用户名在注册时为XXX,则会创建子域名,如XXX.example.com

怎么做?

我将使用php进行脚本编写。

6 个答案:

答案 0 :(得分:1)

这可能比你想象的复杂一点。

我建议对mod重写和htaccess做一些阅读。

你可以从这里开始:

htaccess Tutorial

Modrewrite tutorial

Subdomain Modrewrite Example

编辑:或者只是选择我的SO用户提供的一个很好的例子。 ;)

答案 1 :(得分:1)

我找到了一个似乎就是这样做的脚本,根据需要在服务器上创建一个子域。 它可能需要稍微调整才能在你的特定控制面板上工作,但据我所知,评论非常积极。

Link

您是否考虑过使用htaccess和url重写? 找到可能对您有帮助的代码:

# Rewrite <subdomain>.example.com/<path> to example.com/<subdomain>/<path>
#
# Skip rewrite if no hostname or if subdomain is www
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
# Extract (required) subdomain (%1), and first path element (%3), discard port number if present (%2)
RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^([^.]+)\.example\.com(:80)?<>/([^/]*) [NC]
# Rewrite only when subdomain not equal to first path element (prevents mod_rewrite recursion)
RewriteCond %1<>%3 !^(.*)<>\1$ [NC]
# Rewrite to /subdomain/path
RewriteRule ^(.*) /%1/$1 [L]

Source (Post #6)

答案 2 :(得分:1)

只要这是非SSL站点,那么到目前为止最简单的方法是不要打扰 - 只需使用通配符DNS域和vhost,然后在PHP代码中映射任何特定于域的行为。如果您需要SSL站点,那么它会更加复杂 - 您需要为每个证书分配一个单独的IP地址/端口 - 而woldcard证书可能非常昂贵。

如果您想要设置某种托管软件包,那么它会涉及到更多 - 您如何处理这取决于您正在使用的Web服务器和DNS服务器。

假设(再次没有SSL)在Unix / POSIX / Linux上使用Apache并绑定,那么,我再次使用通配符DNS条目,然后: 1)为网站创建一个基础目录,可选择使用一组默认文件填充它 2)在名为XXX.conf的/etc/httpd/conf.d中的自己的文件中添加一个vhost定义 3)向HTTPD进程发送kill -HUP(使其无需完全重启即可读取新的配置文件)。

有一点需要注意的是,你真的不应该允许httpd进程直接写入自己的配置文件 - 你肯定不想给它root权限。更安全的解决方案是创建一个CLI脚本,使用用户名作为参数执行此操作,然后将其设置为setuid,并从HTTPD进程运行的脚本中调用它。

下进行。

答案 3 :(得分:0)

最好的方法是在DNS服务器中使用小丑:

www.example.com.    IN  A   1.2.3.4
*.example.com.  IN  A   1.2.3.4

通过这种方式,不必创建子域:默认情况下,所有子域都指向相同的IP。

在您的PHP代码中,您只需获得$ _SERVER [“HOST”]并获得第一部分:

$hostParts=explode('.',$_SERVER["HTTP_HOST"]);
$user=$hostParts[0]

答案 4 :(得分:0)

首先,您需要确保在DNS中设置了通配符域,并确保您的网络服务器(apache?)将该通配符域的所有查询都指向您的php文件。

然后在php中你可以查看$ _SERVER [“HTTP_HOST”]以查看哪个子域用于该特定请求。

答案 5 :(得分:0)

因为您将在用户注册时创建子域。 试试这个.htaccess文件:

Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^.htaccess$ - [f]

RewriteCond %{HTTP_HOST}!^www.domain.com 
RewriteCond %{HTTP_HOST} ^([^.]+).domain.com 
RewriteRule ^$(.*) /$1/%1 [L]

创建一个控制器的功能,它将获取子域的值并显示必要的内容。 像::

public function show ($domain)
{
  **.**..*..**.** Your code goes here
}

当用户尝试 xxx.domain.com/controller/show 时,这将是 domain.com/controller/show/xxx 。如果您想 xxx.domain.com domain.com/controller/show/xxx ,只需根据需要编辑htaccess文件。