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

时间:2012-07-04 07:41:48

标签: apache mod-rewrite redirect subdomain virtualhost

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

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

假设您希望使用VirtualDocumentRoot /htdocs/%0执行此操作,以便您可以添加和删除虚拟主机,而无需修改Apache配置。这很重要:请不要在每次虚拟主机出现或移动时都不要弄乱htaccess文件或httpd.conf - 无论该主机是否是父域。事实上,假设你正在使用AllowOverride None

无论如何,问题是,您如何将不存在的子域重定向到相应的父域而不重定向现有的子域?

1 个答案:

答案 0 :(得分:1)

我可能已经解决了自己的问题。但是,如果有人发现我正在做的事情有问题,我会很感激。

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

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

允许我设置通配符DNS并使用基于名称的虚拟主机,而无需触及任何配置设置。此外,没有涉及htaccess。只需使用任何名称“/htdocs/[host.]domain.tld”创建您的文件夹,即可启动并运行。据我所知,这不适用于SSL / TLS(可能与%{HTTP_HOST}有关吗?​​),但安全网站相对较少,并且通过IP地址比通过主机名更好地解决。