如何创建像http://user.mywebsite.com这样的子域?我必须以某种方式访问htaccess吗?它实际上是否可以通过纯PHP代码创建它,或者我需要使用一些外部脚本 - 服务器端语言?
对于那些回答:那么,如果他们提供某种DNS访问,我应该问我的主机吗?
您正在寻找创建自定义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
您所追求的功能称为通配符子域.它允许您不必为每个子域设置DNS,而是使用apache重写进行重定向.你可以在这里找到一个很好的教程,但有成千上万的教程.以下是该教程中的必要代码:
DocumentRoot /www/subdomain ServerName www.domain.tld ServerAlias *.domain.tld
但是,由于需要使用VirtualHosts,因此必须在服务器的httpd.conf文件中设置,而不是本地.htaccess.
我和马克有点不同.我传递整个域并在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代码中,我只是从hostName中删除了我的用户名.这给了我漂亮的SEO网址.
我们像上面解释的那样设置了通配符DNS.所以记录是*.yourname.com
然后,所有子域实际上都会转到同一个地方,但PHP会将每个子域视为不同的帐户.
我们使用以下代码:
$url=$_SERVER["REQUEST_URI"]; $account=str_replace(".yourdomain.com","",$url);
此代码只是将$account
变量设置为与子域相同.然后,您可以根据其帐户检索其文件和其他信息.
这可能不如上面列出的方式有效,但是如果您无法访问BIND和/或限制.htaccess,则此方法应该有效(只要主机为您设置通配符).
我们实际上使用此方法连接到多公司电子商务应用程序的客户数据库,但它也可能适用于您.
当你可以使用Apache群发虚拟主机时,不要大惊小怪.htaccess文件.
从文档:
#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs
在某种程度上,它与您的问题相反:每个"子域"都是用户.如果用户不存在,则会获得404.
唯一的缺点是环境变量DOCUMENT_ROOT
未正确设置为used子目录,而是de htconfig中的默认document_root.
适用于子域和多域Web应用程序的简单PHP解决方案
步骤1.为您要服务的域(或域)提供DNS A记录"*""example.org"
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