把它改成这个应该做你想做的:
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+)\.
RewriteRule ^sitemap\.xml$ /%1.sitemap.xml [L,NC]
更新
为了解释正则表达式,它的作用如下:
^(?:www\.)?([^.]+)\.
^ 表示匹配字符串的开头,因此这会将正则表达式锚定到字符串的开头。
(?:) 表示仅将其用于分组,不要捕获匹配的内容(因此在这种情况下它不会用完 %1)。
www\. 只是表示匹配“www.”,点必须用斜杠转义,否则它有特殊含义。
括号(?:www\.)?后面的问号表示该组是可选的,要么存在要么不存在,两者都会成功匹配。
所以此时我们要么仍在字符串的开头,要么就在“www.”之后。
现在我们继续使用([^.]+)\. 将所有内容带到下一个点。这是因为...
() 是一个捕获组,因此在这种情况下,它会捕获与%1 匹配的内容。
[^.]+ 表示用[^.] 匹配任何不是点的东西,在这种情况下,点不需要转义,因为它在这个“字符类”中。开头的插入符号^ 使其成为否定匹配,因此匹配任何未指定的内容。之后的+ 表示匹配其中的一个或多个,并且“贪婪”地进行匹配,以便匹配最长的字符串。
因此,由于我们是贪婪匹配,这意味着关闭 \. 实际上没有必要,因为贪婪匹配无论如何都会去那里,但我喜欢将锚点放在正则表达式中,因为它使它们更容易阅读和理解.这不会造成任何伤害,因为任何有效的主机名都会在我们匹配的主机名之后有另一部分。
另一种选择是在字符串末尾使用点或选项,使用(?:\.|$),其中管道是“alternation”,表示“this or那个”(或者那个,或者那个,如果使用更多的话)。非捕获组用于包含交替。所以在那种情况下,它会变成:
^(?:www\.)?([^.]+)(?:\.|$)
这意味着它也适用于“localhost”之类的东西。