使用.htaccess将非www URL重定向到www

时间:2008-09-08 23:14:45

标签: .htaccess isapi-rewrite

我正在使用Helicon's 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。如何重写上述规则以便子域不会被重定向?

7 个答案:

答案 0 :(得分:3)

附加以下RewriteCond:

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

这样,它只会将规则应用于nondottedsomething.uptofiveletters,你可以看到,subdomain.domain.com将不符合条件,因此不会被重写。

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

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

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

答案 1 :(得分: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>

答案 2 :(得分:1)

Zigdon有正确的想法,除了他的正则表达不太正确。使用

^example\.com$

而不是他的建议:

^example\.com(.*)

否则你不只是匹配example.com,你将匹配像example.comcast.net,example.com.au等的东西。

答案 3 :(得分:1)

@Vinko

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

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

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

OP是否与OP有任何关系,我不知道,但如果您正在“解决所有问题”的答案,请注意这一点。

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

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

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

当然,不会重新指挥,这将继续正常