我正在寻找允许以下内容的Apache配置:
/%docRoot%/domain.com/sub
和我会对任何解决方案表示感谢,特别是如果没有涉及mod_rewrite
(使用mod_vhost_alias
)。
注意:使用mod_vhost_alias
有一些明显的解决方案,但它们适用于 domain.com 或 sub.domain.com ,似乎都没有涵盖两种情况。
度过美好的一天!
答案 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.com
与sub.domain.com
之类的内容。如果您想将www.domain.com
重定向到domain.com
,则必须在之前这些规则。