【发布时间】:2010-11-15 16:08:25
【问题描述】:
我不希望人们能够在我的网站中注册他们自己的部分,并让这些部分成为他们自己网站的子域。所以有人可以注册 'test' 并让 'test.example.com' 引用他们的网站,例如 /site.php?id=1 那么我将如何为此编写 mod_rewrite 规则?
【问题讨论】:
标签: php mod-rewrite subdomain
我不希望人们能够在我的网站中注册他们自己的部分,并让这些部分成为他们自己网站的子域。所以有人可以注册 'test' 并让 'test.example.com' 引用他们的网站,例如 /site.php?id=1 那么我将如何为此编写 mod_rewrite 规则?
【问题讨论】:
标签: php mod-rewrite subdomain
实际上,在过去的一年中,我们一直在使用这种技术,没有遇到太大问题。我们的 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 问题。
【讨论】:
您可以将 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 设置为接受所有子域。
希望有帮助!
【讨论】:
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];
}
【讨论】: