Regex 将带有www的任何子域的URL重写为不带www的相应子域

Regex 将带有www的任何子域的URL重写为不带www的相应子域,regex,mod-rewrite,apache2,subdomain,Regex,Mod Rewrite,Apache2,Subdomain,我们有一个多子域站点,根据子域文本生成动态内容。但是,如果将www附加到子域,则不起作用。由于一些用户习惯于在每个URL前面添加www,我们希望通过URL重写来修复它 编辑 我已经做到了这一点: RewriteEngine on RewriteCond %{HTTP_HOST} !^www\.subdominio\.dev [NC] RewriteCond %{HTTP_HOST} !^$ RewriteCond %{http_host} ^www\.([^\.]+)\.subdominio\.

我们有一个多子域站点,根据子域文本生成动态内容。但是,如果将www附加到子域,则不起作用。由于一些用户习惯于在每个URL前面添加www,我们希望通过URL重写来修复它

编辑

我已经做到了这一点:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.subdominio\.dev [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{http_host} ^www\.([^\.]+)\.subdominio\.dev [NC]
RewriteRule ^(.*) http://%1.subdominio.dev$1 [R=301,QSA,NC]
出人意料的是。它在我的一个测试子域中运行良好,但在另一个子域中运行不正常:

www.otro-mas.subdominio.dev被重定向到otro-mas.subdomino.dev(有或没有像/index.html这样的URI)。正如所料

然而,www.ono.subdominio.dev将进入无限重定向。像这样:

为什么不重写主机?

试试这个:

RewriteCond %{HTTP_HOST} ^www\.([a-zA-Z-_]+)\.domain\.com [NC]
RewriteRule ^(.*)$ http://%1\.domain\.com/$1 [R=301,NC,QSA,L]
您可能忘记了
QSA
L
指令(在上搜索解释)。

它确实有效

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.subdominio\.dev [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{http_host} ^www\.([^\.]+)\.subdominio\.dev [NC]
RewriteRule ^(.*) http://%1.subdominio.dev$1 [R=301,QSA,NC]

我的浏览器中的缓存出现了一些问题。

可能我不必替换重写规则点?请尝试重写规则^http://%1\.domain\.com/$1[R=301,L]投票迁移到webmasters.stackexchange.com。即使这里的人知道答案,问答可能在主题更集中的地方更有价值。我不介意把它转移给网站管理员。我不知道怎么做。@Krister:是的,使用http://确实有帮助,但我想我的正则表达式还是有问题。谢谢你的回复。我没有看到对应用QSA有任何影响,也不确定我在这里是否有意义,因为这将应用到一个有自己重定向的drupal安装中。你应该在你的回答中也对这一点进行细化:它是drupal:)。是的,“LAST”是有意义的,因为当我使用像这样的重定向时,它总是一个真正的重定向,我总是希望它被直接重定向,而不做任何进一步的事情(=你可能不想处理URL,只要它以
www
开头,对吗?)。嗨,谢谢你的帮助。你可能是对的,我对重定向知之甚少,我也不确定drupal是否非常依赖它们。关于www,我只想处理具有额外www.Damn级别的子域。这就是为什么我每天都告诉我的同事在匿名模式下使用Chrome的原因:添加这些选项:
——开始最大化——匿名,你可以肯定,当你退出Chrome时,包括DNS在内的一切都被忘记了,而Firefox拥有自己的DNS“缓存”(即使在私有模式下)的情况并非如此。