如何创建像http://user.mywebsite.com这样的子域?我必须以某种方式访问htaccess吗?是否真的可以通过纯PHP代码创建它,或者我需要使用一些外部脚本服务器端语言?
对那些回答的人:那么,我应该问我的托管服务商是否提供某种DNS访问?
wildcard subdomains
可以在中实现.htaccess
。请参阅我的解决方案。
如何创建像http://user.mywebsite.com这样的子域?我必须以某种方式访问htaccess吗?是否真的可以通过纯PHP代码创建它,或者我需要使用一些外部脚本服务器端语言?
对那些回答的人:那么,我应该问我的托管服务商是否提供某种DNS访问?
wildcard subdomains
可以在中实现.htaccess
。请参阅我的解决方案。
Answers:
您要创建自定义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重写进行重定向。您可以在此处找到一个不错的教程,但是那里有成千上万的教程。这是该教程中必要的代码:
<VirtualHost 111.22.33.55>
DocumentRoot /www/subdomain
ServerName www.domain.tld
ServerAlias *.domain.tld
</VirtualHost>
但是,由于需要使用VirtualHosts,因此必须在服务器的httpd.conf文件中进行设置,而不是在本地.htaccess中进行设置。
我的做法与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.com/album/Dance/now
我回来
http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com
然后在我的index.php代码中,我只是将用户名从hostName爆炸了。这给了我漂亮的SEO URL。
我们按照上面的说明设置通配符DNS。所以记录是* .yourname.com
然后,所有子域实际上都将移至同一位置,但是PHP将每个子域视为不同的帐户。
我们使用以下代码:
$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);
此代码仅将$account
变量设置为与子域相同。然后,您可以根据他们的帐户检索他们的文件和其他信息。
这可能不像上面列出的方法那样有效,但是,如果您无权访问BIND和/或受限的.htaccess,则此方法应该有效(只要您的主机将为您设置通配符)。
实际上,我们使用此方法连接到多公司电子商务应用程序的客户数据库,但是它也可能对您有用。
当您可以使用Apache Mass Virtual Hosting时,请不要大惊小怪。
从文档中:
#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
首先,您需要确保将服务器配置为允许通配符子域。我在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]
最后,您要做的就是在subdomains文件夹中创建一个文件夹,然后将子域的文件放在该目录中。
.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]
最后,为您的子域创建一个文件夹并放置子域文件。
使用PHP和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
该文件正在重写子域网址。
http://yourwebsite.com/index.php?siteName=9 课 到 http://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
$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