虽然用vhost可以支持子域名, 但不方便.
RewriteCond $1 !^bbs/ RewriteCond %{HTTP_HOST} bbs.example.com RewriteRule (.*) /bbs/$1 [L]
RewriteCond $1 !^bbs/ 避免内部无限redirect.
或者支持无限子域名:
RewriteCond %{ENV:Rewrite-Done} !^Yes$ RewriteCond %{HTTP_HOST} !^www\.example\.com RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com RewriteRule (.*) /%1/$1 [E=Rewrite-Done:Yes,L]
注: Apache mod_rewrite 有一个严重的BUG, 无法获取自己设置的环境变量. 所以上面的代码有问题! 所以还是半自动:
RewriteCond $1 !^bbs/ RewriteCond $1 !^OTHER_SUBDOMAIN/ ...... # BUG: RewriteCond %{ENV:Rewrite-Done} !^Yes$ RewriteCond %{HTTP_HOST} !^www\.example\.com RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com RewriteRule (.*) /%1/$1 [E=Rewrite-Done:Yes,L]
补充: xiaobin 提到可以使用 vhost_alias 模块. 我在他的基础之上做了改进, 结合 mod_rewrite, 可以更好的兼容www子域:
<VirtualHost *:80> ServerAlias ideawu.net *.ideawu.net VirtualDocumentRoot /home/work/htdocs/ideawu.net/%1 RewriteEngine On RewriteCond %{HTTP_HOST} ^ideawu.net$ RewriteRule /(.*) http://www.ideawu.net/$1 [R=301,L] </VirtualHost>