【问题标题】:Redirecting non-www URL to www using .htaccess使用 .htaccess 将非 www URL 重定向到 www
【发布时间】:2008-09-08 23:14:45
【问题描述】:

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

【问题讨论】:

    标签: .htaccess isapi-rewrite


    【解决方案1】:

    附加以下 RewriteCond:

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

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

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

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

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

    【讨论】:

    • 您是说我应该用您的条件替换第 2 行,还是在新行中添加您的条件?将其添加到新行会影响使用 %1、%2 和 %3 的 RewriteRule 吗?
    【解决方案2】:

    我使用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>
    

    【讨论】:

      【解决方案3】:

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

      ^example\.com$

      而不是他的建议:

      ^example\.com(.*)

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

      【讨论】:

        【解决方案4】:

        @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 的人们提出了一个很好的案例(恕我直言),因为这是“正确”的做法,但这仍然只是一个偏好问题。有一件事是肯定的,为这种重定向编写通用规则比这个要容易得多。

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 它应该是 ^example\.com$。无论如何,我的印象是克里斯想要一个通用的解决方案,而不是针对单个域的解决方案。
            【解决方案7】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-12
              • 2012-02-06
              • 2012-10-19
              • 1970-01-01
              • 2012-11-16
              相关资源
              最近更新 更多