如果您正在运行 *AMP,最好的做法是按照 Thomas 的建议在 Apache 中做虚拟主机。您可以使用或不使用您描述的重定向来执行此操作。
虚拟主机
很可能您会想做基于名称的虚拟主机,因为它最容易设置并且只需要一个 IP 地址(因此也很容易在本地 MAMP 机器上设置和测试)。基于 IP 的虚拟主机在其他一些方面更好,但您必须为每个域设置一个 IP 地址。
这个Wikipedia 页面在底部讨论了如何进行基于名称的虚拟主机的差异和链接。
在您的本地机器上进行测试,您还必须在 /etc/hosts 中为您的假测试域名设置假 DNS 名称。即,如果您有 Apache 在 localhost 上侦听并在您的 Apache 配置中设置 vhost1.test.domain 和 vhost2.test.domain,您只需将这些域添加到 /etc/hosts 中的 127.0.0.1 行,在 localhost 之后:
127.0.0.1 localhost vhost1.test.domain vhost2.test.domain
一旦你完成了 /etc/hosts 编辑并将基于名称的虚拟主机配置添加到你的 Apache 配置文件中,就是这样,重新启动 Apache 并且你的测试域应该可以工作。
使用 mod_rewrite 重定向
如果您想使用 mod_rewrite 进行重定向(这样 user.example.com 不会直接托管,而是重定向到 example.com/user),那么您还需要执行 RewriteCond 以匹配子域并重定向它:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com
RewriteRule ^(.*)$ http://example.com/subdomain$1 [R]
你可以把它放在一个 .htaccess 或者你的主要 Apache 配置中。
您需要为要重定向的每个子域添加一对规则,例如最后两个规则。或者,您可以在 RewriteCond 中捕获子域,以便能够使用一个通配符规则将 *.example.com 重定向到 example.com/ * - 但从安全角度来看,这对我来说真的很糟糕。
一起,虚拟主机和重定向
最好更明确一点,为您要侦听的每个主机名设置一个虚拟主机配置部分,并将这些主机名中的每一个的重写规则放在其虚拟主机配置中。(如果可以的话,将这种东西放在 Apache 配置中而不是 .htaccess 中总是更安全、更快——.htaccess 会降低性能,因为 Apache 会不断地在文件系统中搜索 .htaccess 文件并重新解析它们,并且它不太安全,因为这些可能会被用户搞砸。)
这样一来,Apache 配置中的虚拟主机配置将是:
NameVirtualHost 127.0.0.1:80
# Your "default" configuration must go first
<VirtualHost 127.0.0.1:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /www/siteroot
# etc.
</VirtualHost>
# First subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
ServerName vhost1.example.com
RewriteEngine On
RewriteRule ^(.*)$ http://example.com/vhost1$1 [R]
</VirtualHost>
# Second subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
ServerName vhost2.example.com
RewriteEngine On
RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
</VirtualHost>