Apache mod_rewrite任何子域到根域,除非作为virtualdocumentroot存在

假设你已经有了一个Apache2的虚拟主机设置,如下所示:

/htdocs/parent1.com /htdocs/sub1.parent1.com /htdocs/sub2.parent1.com /htdocs/parent2.net /htdocs/parentn.org 

假设您希望使用VirtualDocumentRoot /htdocs/%0来执行此操作,以便您可以添加和删除虚拟主机,而无需修改Apacheconfiguration。 这一点很重要:请不要在每次虚拟主机进入或离开时都使用htaccess文件或httpd.conf – 无论该主机是否为父域。 事实上,假设你正在使用AllowOverride None

无论如何,问题是,如何将不存在的子域redirect到其对应的父域而不redirect已存在的子域呢?

我可能已经解决了我自己的问题。 不过,如果有人发现我正在做的事情有问题,我将不胜感激。

只要存在相应的文档根目录,下面就将任何请求留给任意的子域名; 但将任何请求重定向到文件系统中不存在的子域。

 <Ifmodulee rewrite_module> RewriteEngine On RewriteMap lowercase int:tolower RewriteCond "/htdocs/${lowercase:%{HTTP_HOST}}" !-d RewriteCond %{HTTP_HOST} "\.([^\.]+\.[^\.]+)$" RewriteRule ^/(.*)$ "http://%1/$1" [R=301] </Ifmodulee> 

允许我设置通配符DNS并使用基于名称的虚拟主机,而无需触摸任何配置设置。 另外,没有htaccess涉及。 只需使用“/htdocs/[host.]domain.tld”之类的名称制作文件夹,然后启动并运行。 据我所知,这实际上不适用于SSL / TLS(可能与%{HTTP_HOST} ?),但安全站点通过IP地址比主机名%{HTTP_HOST} ,更好解决。