我在用着 Helicon 的 ISAPI 重写 3, ,它基本上在 IIS 中启用 .htaccess。我需要将非 www 网址重定向到 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。如何重写上述规则以使子域不会被重定向?

有帮助吗?

解决方案

附加以下 RewriteCond:

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

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

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

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

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

其他提示

我已经获得了更多的控制权 网址重写器网, , 就像是:

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>

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

^example\.com$

而不是他的建议:

^example\.com(.*)

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

@温科

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

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

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

我不知道这是否是OP关心的问题,但如果您想要“修复所有问题”的答案,则需要注意这一点。

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

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

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

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

(请注意克里斯,那个 将要 更改%1)

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

不能将RewriteCond调整为仅在example.com上操作吗?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]

为什么你不在你的 vhost (httpd) 文件中添加类似的内容呢?

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top