在 Apache 2.2.x 上我已经激活mod_userdir。我使用了默认设置,这样http://localhost/~name/
将与 连接~name/public_html/
,并且 public_html 内的路径~name/public_html/mySite
可以通过 到达http://localhost/~name/mySite
。
我怎样才能实现通过 到达相同的路径http://mySite.name.localhost/
?我不想像其他 SF 问题中建议的那样采用手动方法(例如Apache:设置带有子域名的本地测试服务器),而是希望将所有可用路径自动映射到相应的 URL。
我认为,需要采取几个步骤:更改 mod_userdir 配置,以便 localhost 的子域将与计算机上所有可用的用户名相关联。第二步可能包括使用 mod_rewrite,以便子子域可以与 ~name/public_html 中的路径匹配...
您喜欢哪种方式?
编辑:
该解决方案已标记。我进行了一些小修改以满足特殊要求并添加了评论:
RewriteEngine on
# check, if not redirected yet
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# look for URLS like 'subdir.username.localhost'
RewriteCond %{HTTP_HOST} (.+)\.([^.]+)\.localhost$
# check if /home/username/public_html/subdir is a directory or symbolic link
RewriteCond /home/%2/public_html/%1 -d [OR]
RewriteCond /home/%2/public_html/%1 -l
# rewrite to default target
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
# rewrite to /home/username/public_html/subdir
RewriteRule (.+)\.([^.]+)\.localhost(?::\d+)?(.*) /home/$2/public_html/$1$3 [L]
答案1
几周前我也遇到过类似的需求。我使用 mod_rewrite 解决了这个问题,方法是将其放入我的默认 vhost 定义中:
RewriteEngine on
# look for URLS like 'subdir.username.localhost'
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ([^.]+)\.([^.]+)\.localhost$
RewriteCond /home/%2/public_html/%1 -d
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ([^.]+)\.([^.]+)\.localhost(?::\d+)?(.*) /home/$2/public_html/$1$3 [L]
更多信息请访问https://gist.github.com/744971,包括将 username.localhost 解析为 /home/username/public_html