我不希望人们能够在我的网站中注册他们自己的部分,并让这些部分成为我自己的网站子域。所以有人可以注册'test'并让'test.example.com'引用他们的网站,比如说/site.php?id=1那么我该如何为此编写一个mod_rewrite规则呢?
答案 0 :(得分:2)
mod_rewrite
可能不是最好的工具。 RewriteRules非常适合将文件映射到其他内容,但它并不适用于域匹配。
使用mod_rewrite
可以做的最好的事情如下:
RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L]
哪个不太有用。如果以编程方式检查HTTP_HOST
的值,我建议您做什么:
function get_subdomain() {
if(preg_match('/^([^.]+)\.domain\.com/i', $_SERVER['HTTP_HOST'], $matches))
return $matches[1];
}
答案 1 :(得分:0)
您可以将apache配置为在虚拟主机容器中声明apache配置中的“特殊”域(例如www.mydomain.com等),并将其他域默认为您的第一个虚拟主机。然后,您可以将基本URL重写到检查URL的调度应用程序,并将用户发送到正确的区域。
来自Apache 2.0文档:
几乎所有的Apache指令都可以使用 进入VirtualHost容器。该 第一个VirtualHost部分用于 没有已知服务器名称的请求。
将代码放在第一个虚拟主机中处理* .mydomain.com:
<VirtualHost *:80>
Servername custom.mydomain.com
DocumentRoot /var/www/html/custom
RewriteEngine on
RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R]
# more configs here
</VirtualHost>
<VirtualHost *:80>
Servername www.mydomain.com
DocumentRoot /var/www/html/homepage
# more configs here
</VirtualHost>
在dispatch.cgi中,检查调用url以确定用户应该去哪里。确保将DNS设置为接受所有子域。
希望有所帮助!
答案 2 :(得分:0)
实际上,过去一年我们一直在使用这种技术没有太多问题。我们的mod_rewrite配置如下:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www.mydomain.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com
RewriteCond %{REQUEST_URI} !admin
RewriteRule (.*) /admin/ [R=301,L]
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L]
会发生什么情况,用户会被定向到theiraccount.mydomain.com/admin。
然后我们使用PHP来识别域名的帐户部分。使用$ _SERVER ['SERVER_NAME']或获取域名并解析它的方法非常有效。
将这些配置保留在httpd.conf中,如果它保持为.htaccess,这将成为更高流量站点中的cpu问题。