Apache mod_将所有域重写为一个tld

Apache mod_将所有域重写为一个tld,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在寻找一种透明(无需重定向)将所有域重写到同一个域但只有一个tld的方法。因此: random.domain.tld->random.domain.local 如果tld之前有未知数量的段,tld本身是未知的,tld中永远不会有点(如co.uk),因此它应该是最后一个点之前的所有内容和最后一个点之后的所有内容 我已经修补了一段时间,但运气不好: RewriteRule ^([^.]+)\.([^\.]*?)$ $1.local [L] 使用简单的重写规则无法做到这一点,因为这只适用于url

我正在寻找一种透明(无需重定向)将所有域重写到同一个域但只有一个tld的方法。因此:

random.domain.tld->random.domain.local

如果tld之前有未知数量的段,tld本身是未知的,tld中永远不会有点(如co.uk),因此它应该是最后一个点之前的所有内容和最后一个点之后的所有内容

我已经修补了一段时间,但运气不好:

RewriteRule ^([^.]+)\.([^\.]*?)$ $1.local [L]

使用简单的重写规则无法做到这一点,因为这只适用于url的路径。相反,您需要一个RewriteCond来获取额外的引用:

RewriteEngine on
RewriteCond %{HTTP_HOST} !\.local$
RewriteCond %{HTTP_HOST} ^(.+)\.[^.]+$
RewriteRule ^(.*)$ http://%1.local$1 [P,QSA]
关于此类重写规则的一般提示:如果您可以通过http服务器配置进行访问,那么您应该始终希望将此类规则放入主机配置部分。htaccess风格的文件是出了名的容易出错的,它们使事情变得复杂,很难调试,并且降低了服务器的速度。如果您没有访问http服务器配置的权限,它们只是一种替代方法


然而,如果目标仅仅是为了测试目的而使用临时方法“重定向”请求,那么通常更简单、更优雅的方法是使本地DNS条目覆盖待测试域的实际地址

所以你在计划一个蜜罐。问题是:为了保护还是为了骗局?两者都不是。我们需要使用subdomain.domain.developername以最简单的方式访问subdomain.domain.local和其他20个位于每个开发人员虚拟机上的站点,而不需要更改我们的框架配置。最简单的方式是简单地将本地DNS条目指向您的开发系统。我们已将DNS设置为允许每个开发者在我们的本地网络上都有自己的tld。只需要在本地机器上将个人tld转换为apache中的真实tld,而无需重新配置我们的应用程序。我们的想法是,当一个新开发人员加入我们并设置他们的开发虚拟机时,我们会将他们添加到office dns中,并且虚拟机上的Apache会自动将任何不以.local结尾的内容转换为.local。这似乎就在那里。。唯一的问题是它在frontend_dev.php上给出了一个禁止的错误,因为它位于htaccess“RewriteRule^(.*)$/frontend_dev.php[QSA,L]”中的这一行之后。这是一个完全独立的问题吗?我不确定我是否正确:你的意思是在一些.htaccess样式的文件中有额外的规则?如果您评论中的规则在我发布的规则之前,那么由于您指定的
L
标志,将不会再进行重写。请阅读您的编辑。是的,我们可以完全访问apache服务器配置。谢谢你指出这一点。是的,我们在htaccess中有其他规则。这是一个symfony应用程序,它将所有请求重写到单个前端控制器(在我们称为frontend_dev.php的案例中,我将对此进行进一步修改。我怀疑您的答案正是我们所需要的,只是需要让它在特定的框架设置中更好地工作。当然,在这种情况下,您可能需要尝试一下。请注意,我刚刚对规则集做了另一个更改:我在防止无休止的重写循环。。。