这看起来像您正在使用 isapi_rewrite v2,所以我会回答那个版本。v3 语法略有不同。
在第一行中,我认为它需要!
对 www 进行负面预测。如图所示,它匹配 www 而不是非 www。
答案涉及捕获 url 的各个部分,然后在重写中使用它们与子匹配 $1、$2 等。
RewriteCond Host: (?!www\.)example.com
RewriteRule (.*) http\://www.example.com$1 [I,RP]
您可以通过捕获而不是 example.com 使其对任何域更通用,只需将其轻松复制到其他网站。它成为第一个捕获 $1,而 URL 的其余部分现在是 $2。
RewriteCond Host: (?!www\.)(.*)
RewriteRule (.*) http\://www.$1$2 [I,RP]
上面的规则将始终重定向到 http,即使页面是 https。如果您想按原样保留 http 或 https,例如https://example.com/a?b=1
to https://www.example.com/a?b=1
,则查找 https 标志,并替换“s”。这很难用语言来描述:这会查找 HTTPS 服务器变量值“on”,如果它是“on”则保留它(现在是第二次捕获),如果它是其他任何东西,则不保留它。然后,在规则中,?2 正在测试是否有第二次捕获。如果是这样,它会添加一个“s”,否则(冒号),它什么都不添加(冒号后什么都不添加)。在这组中,url 的其余部分现在是第三个子字符串。
RewriteCond Host: (?!www\.)(.*)
RewriteCond %HTTPS (on)|.*
RewriteRule (.*) http(?2s:)\://www.$1$3 [I,RP]
最后(几乎完成了!),这并没有单独留下子域。由于 (.*) 而不是 'example.com',它将重写abc.example.com/whatever...
为www.abc.example.com/whatever...
. 因此,如果您有子域要单独处理,例如,为开发人员准备的 staging 或 localhost,或者为托管购物域说“shop”,您可以使用“www”“或”这些(注意 localhost 没有尾随点,只处理 //localhost)。
RewriteCond Host: (?!www\.|staging\.|shop\.|localhost)(.*)
RewriteCond %HTTPS (on)|.*
RewriteRule (.*) http(?2s:)\://www.$1$3 [I,RP]