0

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

  • 将 sub.domain.com作为,/%docRoot%/domain.com/sub
  • 将能够为每个托管域和任何子域执行此操作(即,没有每个域的虚拟主机配置)

我将不胜感激任何解决方案,特别是如果没有mod_rewrite涉及(使用mod_vhost_alias)。

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

祝你今天过得愉快!

4

1 回答 1

1

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

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反向引用)开始。

有了这个,您将您的虚拟主机设置为接受每个域(默认虚拟主机),并且任何子域/域都将被路由。例子:

  • 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

编辑2:

是的,我非常希望将 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]

基本上是一样的,除了需要调整一些正则表达式来区分 adomain.comsub.domain.com. 如果你想重定向www.domain.comdomain.com,那需要在这些规则之前发生。

于 2012-08-08T19:09:04.713 回答