Apache中的子域到子文件夹

时间:2012-08-08 18:56:43

标签: apache mod-rewrite mod-vhost-alias

我正在寻找允许以下内容的Apache配置:

  • sub.domain.com 作为/%docRoot%/domain.com/sub
  • 投放
  • 能够为每个托管域和任何子域执行此(即,没有每个域vhost配置)

我会对任何解决方案表示感谢,特别是如果没有涉及mod_rewrite(使用mod_vhost_alias)。

注意:使用mod_vhost_alias有一些明显的解决方案,但它们适用于 domain.com sub.domain.com ,似乎都没有涵盖两种情况。

度过美好的一天!

1 个答案:

答案 0 :(得分:1)

*.domain.com指向您的文档根目录(/%docRoot%/)。您需要在vhost配置中执行此操作。在同一个vhost中,添加:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/domain.com/
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
RewriteRule ^/(.*)$ /domain.com/%1/$1 [L]

如果您想避免将www.domain.com指向/%docRoot%/domain.com/www,请添加条件将其排除:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/domain.com/
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
RewriteRule ^/(.*)$ /domain.com/%1/$1 [L]

编辑:

  

我假设我仍然需要为每个托管域执行此操作(因为您发布的示例都是指“domain.com”)。我对吗?

是的,以上只会针对domain.com进行路由,如果您想对所有domain.com执行此操作,则需要做一些更棘手的事情:

RewriteEngine On
# here, %1 = subdomain name, and %2 = domain name
RewriteCond %{HTTP_HOST} ^([^\.]+)\.(.+)$ [NC]
# make sure the request doesn't already start with the domain name/subdomain name
RewriteCond %{REQUEST_URI}:%2/%1 !^/([^/]+/[^/]+)[^:]*:\1
# rewrite
RewriteRule ^/(.*)$ /%2/%1/$1 [L]

这里棘手的是%{REQUEST_URI}:%2/%1 !^/([^/]+/[^/]+)[^:]*:\1匹配。它假定条件为:%{REQUEST_URI}:domain.com/sub并确保%{REQUEST_URI} 不以 domain.com/sub开头(使用%2 /%1返回上一次匹配)使用\1后退参考。

使用此功能,您可以设置vhost以接受每个域(默认vhost),并且将路由任何子域/域。例子:

  • http://blah.bleh.org/file.txt转到/%docRoot%/bleh.org/blah/file.txt
  • http://foo.bar.com/some/path/转到/%docRoot%/bar.com/foo/some/path/
  • http://sub2.sub1.d.com/index.html转到/%docRoot%/sub1.d.com/sub2/index.html

EDIT2:

  

是的,我非常希望将domain.com路由到/%docRoot%/domain.com/

试试这些:

RewriteCond %{HTTP_HOST} ^(.+?)\.([^\.]+\.[^\.]+)$ [NC]
RewriteCond %{REQUEST_URI}:%2/%1 !^/([^/]+/[^/]+)[^:]*:\1
RewriteRule ^/?(.*)$ /%2/%1/$1 [L]

RewriteCond %{HTTP_HOST} ^([^\.]+\.[^\.]+)$ [NC]
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)[^:]*:\1
RewriteRule ^/?(.*)$ /%1/$1 [L]

基本上是相同的,除了一些正则表达式需要调整以分隔domain.comsub.domain.com之类的内容。如果您想将www.domain.com重定向到domain.com,则必须在之前这些规则。