1

我在 httpd.ini 文件中使用以下行将访问 example.com 的用户重定向到 www.example.com:

RewriteCond Host: (?:www\.)?example.com
RewriteRule (.*) http\://www.example.com [RP,L]

我想知道用户是否在没有 www 的情况下访问我的网站时如何重定向查询字符串,例如:

我的用户访问:

example.com?a=1&b=2
example.com/a/b

我想重定向到:

www.example.com?a=1&b=2
www.example.com/a/b

有人可以帮助我吗?

非常感谢。

4

1 回答 1

4

这看起来像您正在使用 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=1to 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]
于 2011-07-05T02:57:10.953 回答