6

我正在使用Helicon 的 ISAPI Rewrite 3,它基本上可以在 IIS 中启用 .htaccess 。我需要将非 www 的 URL 重定向到 www 版本,即 example.com 应该重定向到 www.example.com。我使用了示例中的以下规则,但它会影响子域:

RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

这在大多数情况下都有效,但也将 sub.example.com 重定向到 www.sub.example.com。如何重写上述规则以使子域不会被重定向?

4

7 回答 7

3

附加以下 RewriteCond:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]

这样,它只会将规则应用于 nondottedsomething.uptofiveletters,如您所见, subdomain.domain.com 将不匹配条件,因此不会被重写。

您可以更改 [az]{2,5} 以获得更严格的 tld 匹配正则表达式,以及为域名中允许的字符放置所有约束(因为 [^.]+ 比严格必要的更宽松)。

总而言之,我认为在这种情况下这是没有必要的。

编辑:sadie 发现了正则表达式的一个缺陷,将它的第一部分从 [^.] 更改为 [^.]+

于 2008-09-08T23:28:15.617 回答
1

我使用urlrewriter.net获得了更多控制权,例如:

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>
于 2008-09-09T00:52:41.373 回答
1

Zigdon 的想法是正确的,只是他的正则表达式不太正确。采用

^example\.com$

而不是他的建议:

^example\.com(.*)

否则,您将不仅匹配 example.com,还将匹配 example.comcast.net、example.com.au 等内容。

于 2008-09-09T01:34:01.617 回答
1

@Vinko

对于您的通用方法,我不确定您为什么选择在正则表达式中限制 TLD 的长度?它不是面向未来的,我不确定它提供了什么好处?它实际上甚至不是“现在证明”,因为那里至少有一个 6 个字符的 TLD (.museum) 不会匹配。

我似乎没有必要这样做。你就不能^[^.]+\.[^.]\+$吗?(注意:问号是句子的一部分,不是正则表达式!)

除此之外,这种方法还有一个更大的问题是:对于不直接位于 TLD 之下的域,它将失败。这是澳大利亚、英国、日本和许多其他国家的域,它们具有层次结构:.co.jp、.co.uk、.com.au 等。

无论这是否与 OP 有任何关系,我不知道,但如果您追求“修复所有”的答案,则需要注意这一点。

OP 尚未明确表示他想要通用解决方案还是针对单个(或小组)已知域的解决方案。如果是后者,请参阅我关于使用 Zigdon 方法的其他说明。如果是前者,那么考虑到这篇文章中的信息,继续使用 Vinko 的方法。

编辑:到目前为止,我遗漏的一件事可能是也可能不是您的商业选择,那就是走另一条路。我们所有的网站都将http://www.domain.com重定向到http://domain.comhttp://no-www.org上的人们提出了一个很好的案例(恕我直言),因为这是“正确”的做法,但它仍然肯定只是一个偏好问题。有一件事是肯定的,为这种重定向编写一个通用规则比这个要容易得多。

于 2008-09-09T18:46:31.573 回答
1

@org 0100h 是的,问题描述中遗漏了许多变量,您的所有观点都是有效的,应在实际实施时加以解决。您提出的正则表达式既有优点也有缺点。一方面它更容易和未来证明,另一方面,如果在 Host 标头中发送,你真的想匹配 example.foobar 吗?当您最终重定向到错误的域时,可能会有一些极端情况。第三种选择是修改正则表达式以使用实际域的列表,如果有多个,例如

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]

(请注意克里斯,这改变 %1)

@chrisofspades这并不是要替换它,您的第二个条件确保它没有www,而我的没有。它不会更改 %1、%2、%3 的值,因为它不存储匹配项(iow,它不使用括号)。

于 2008-09-09T21:14:02.747 回答
0

您不能将 RewriteCond 调整为仅在 example.com 上运行吗?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]
于 2008-09-08T23:18:18.837 回答
0

你为什么不在你的(httpd 的)vhost 文件中有这样的东西?

ServerName: www.example.com
ServerAlias: example.com

当然不会重定向,只会照常进行

于 2008-09-09T01:23:08.757 回答