【问题标题】:Redirect non-www to www in .htaccess将非 www 重定向到 .htaccess 中的 www
【发布时间】:2012-08-16 13:06:57
【问题描述】:

我的 .htaccess 文件中有这个:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com$1 [R=301,L]

但是每当我访问我的根目录上的文件时,例如http://example.com/robots.txt,它都会重定向到http://www.example.comrobots.txt/

我怎样才能纠正这个问题,以便正确重定向到http://www.example.com/robots.txt

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    将您的配置更改为此(添加斜杠):

    RewriteCond %{HTTP_HOST} ^example.com$ [NC]
    RewriteRule (.*) http://www.example.com/$1 [R=301,L] 
    

    或者下面概述的解决方案(由@absiddiqueLive 提出)适用于任何域:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    

    如果您需要支持 http 和 https 并保留协议选择,请尝试以下操作:

    RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]
    

    在哪里将 login 替换为 checkout.php 或您需要支持 HTTPS 的任何 URL。

    我认为这是一个坏主意。推理please read this answer.

    【讨论】:

    • 当某些页面(如登录或注册)使用 https 协议时,此解决方案不起作用。
    • 我已经稍微更新了帖子以包含一些信息。很难既通用又正确地选择要使用的协议。
    • 第一个解决方案重定向不够,第二个似乎重定向太多。例如 blog.example.com 变为 www.blog.example.com
    • 能否请您补充一下在本地主机上开发时如何避免重定向?
    • 我一直在关注这里的一切,但没有任何效果。我正在使用 laravel 设置。有谁知道为什么这对我不起作用? www.domain.com 和 domain.com 都可以正常加载,但 domain.com 不会重定向到 www.domain.com。这可能是我的 DNS 的问题吗?
    【解决方案2】:
    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} !^www\.
    
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    

    对于 Https

    RewriteCond %{HTTPS}s ^on(s)|
    
    RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
    

    【讨论】:

    • 此解决方案优于 @ranman 的解决方案,因为它适用于所有域,从而在您为新项目实施代码或为现有项目实施额外域时最大限度地减少人为错误。
    • 我更喜欢这个解决方案,但为什么^(.*)$ 而不是(.*)
    • 此解决方案更好,但我已编辑我的解决方案以包含您的解决方案。
    • 这适用于所有领域,简单而有效!谢谢
    • 你可以关注 RewriteCond %{HTTPS}s ^on(s)|重写规则 ^ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
    【解决方案3】:

    写入 .htaccess :)

    ## Redirect from non-www to www (remove the two lines below to enable)
        RewriteCond %{HTTP_HOST} !^www\. [NC]
        RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    

    【讨论】:

    • 与其他答案相同
    【解决方案4】:

    试试这个,我在很多网站上都用过,效果很好

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
    RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
    

    【讨论】:

      【解决方案5】:

      这是支持 https 和 http 的正确解决方案:

      # Redirect to www
      RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
      RewriteCond %{HTTPS}s ^on(s)|
      RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
      

      UPD.:对于像 .co.uk 这样的域,替换

      RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
      

      RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+\.[^.]+$
      

      【讨论】:

      • 这很完美,它也不会像其他通用解决方案那样将子域重定向到www
      • 这是一个最好的解决方案,比公认的答案好得多,并且可以正确处理 HTTPS
      • 完美运行!就这么几行!
      • 如果我没记错的话,这对不止一个点起作用。示例:yoursite.co.uk
      • 对我不起作用。当我输入 domain.de 时,它​​会将我带到https://domain.de。但我想要https://www.domain.de
      【解决方案6】:
      RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
      RewriteRule (.*) http://www.domain.com/$1 [L,R=301]
      

      这将重定向您不是以 WWW 开头的域 它不会重定向您的所有子域。

      很有用。

      【讨论】:

        【解决方案7】:

        我相信最佳答案成功地将非 www 重定向到 www(例如:mysite.com -> www.mysite.com),但没有考虑通配符子域,这会导致:

        random.mysite.com -> www.random.mysite.com
        

        这是一个带/不带 HTTPS 的解决方案

        HTTP

        RewriteEngine On
        
        RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
        RewriteRule ^(.*)$ http%{ENV:protossl}://www.mysite.com/$1 [L,R=301] 
        

        HTTP/HTTPS

        RewriteEngine On
        
        RewriteCond %{HTTPS} =on
        RewriteRule ^(.*)$ - [env=protocol:https]
        
        RewriteCond %{HTTPS} !=on
        RewriteRule ^(.*)$ - [env=protocol:http]
        
        RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
        RewriteRule ^(.*)$ %{ENV:protocol}://www.mysite.com/$1 [L,R=301]
        

        *注意:我没有测试过 https,因为我目前没有要测试的证书,但是如果有人可以验证或优化我所拥有的,那就太棒了。

        【讨论】:

        • 第一个 $ 在这里做什么:'^(.*)$'
        【解决方案8】:

        在 .htaccess 文件中添加以下代码。

        RewriteCond %{HTTP_HOST} !^www\.
        RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
        

        网址重定向教程可以从这里找到 - Redirect non-www to www & HTTP to HTTPS using .htaccess file

        【讨论】:

          【解决方案9】:

          以下示例适用于 sslnon-ssl,并且速度更快,因为您只需使用一条规则来管理 http 和 https

          RewriteEngine on
          
          
          RewriteCond %{HTTP_HOST} !^www\.
          RewriteCond %{HTTPS}s on(s)|offs()
          RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
          

          [已测试]

          这将重定向

          http

          https

          【讨论】:

          • 非常接近我的想法。也支持 HTTP 主机中的多个点,例如“mysite.co.uk”。
          • 只是出于好奇,你为什么不在这里使用 R=301 呢?如果没有指定代码,它将默认使用 302(移动温度)。
          • 完美运行。这应该是公认的答案。
          • 它还会将 blog.domain.com 重定向到 www.blog.domain.com,这并不总是需要的
          【解决方案10】:

          此配置在配置 SSL 的 bitnami wordpress 中为我工作:

          在文件 /opt/bitnami/apps/wordpress/conf/httpd-app.conf 的“RewriteEngine On”下添加以下内容

          RewriteCond %{HTTP_HOST} .
          RewriteCond %{HTTP_HOST} !^www\. [NC]
          RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
          RewriteBase /
          RewriteCond %{HTTPS} !on
          RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
          

          【讨论】:

            【解决方案11】:

            如果可能,请将其添加到主 Apache 配置文件中。它是一种重量更轻的解决方案,所需的处理更少。

            <VirtualHost 64.65.66.67>
                    ServerName example.com
                    Redirect permanent / http://www.example.com/
            </VirtualHost>
            <VirtualHost 64.65.66.67>
               ServerAdmin me@example.com
               ServerName www.example.com
               DocumentRoot /var/www/example
               .
               .
               . etc
            

            因此,“example.com”的单独VirtualHost 会捕获这些请求,然后将它们永久重定向到您的主VirtualHost。因此,每个请求都没有 REGEX 解析,您的客户端浏览器将缓存重定向,因此它们永远不会(或很少)再次请求“错误”的 url,从而为您节省服务器负载。

            注意,Redirect permanent / http://www.example.com/ 中的尾部斜杠。 没有它,来自example.com/asdf 的重定向将重定向到http://www.example.comasdf 而不是http://www.example.com/asdf

            【讨论】:

              【解决方案12】:

              我已经测试了上述所有解决方案,但对我不起作用,我试图删除 http:// 并且不会重定向也删除了它重定向好的 www,所以我很困惑,特别是我正在运行我的所有https://

              下的网站

              所以我将一些代码组合在一起,并为 http:// 和 https:// 以及 www 和非 www 提出了完美的解决方案。

              # HTTPS forced
              <IfModule mod_rewrite.c>
              RewriteEngine On
              RewriteCond %{HTTPS} off
              RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
              # Redirect to www
              RewriteCond %{HTTP_HOST} !^www\.
              RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
              </IfModule>
              

              希望这可以帮助某人:)

              【讨论】:

                【解决方案13】:

                两个警告

                避免 301,而更喜欢现代 303 或 307 响应状态代码。

                避免 301

                请仔细考虑您是否真的需要指示为[R=301] 的永久重定向,因为如果您决定稍后更改它,那么该页面的先前访问者将继续看到原始重定向的页面。

                永久重定向信息经常存储在浏览器的缓存中,一般很难消除(重新加载页面并不能解决问题)。您的网站访问者将“永远”停留在之前的重定向中。

                也避免 302

                新版本的HTTP协议(v1.1)增加了两个新的响应状态码,可以代替302使用。

                • 303 URL 重定向但要求将请求类型更改为 获取。
                • 307 URL 重定向,但要求保持最初发送的请求类型。

                您仍然可以使用代码302(非永久重定向),尽管它被认为是模棱两可的。无论如何,大多数浏览器实现302 的方式与新的303 代码指示的方式相同。

                【讨论】:

                • 关于您对301的警告,即使我们谈论的是同一个域名,这也适用?不太确定在这种情况下这将如何应用......将所有 URL 从http://example.com/testing 重定向到http://www.example.com/testing。从长远来看,这可能是一个坏方法吗?谢谢,
                猜你喜欢
                • 2012-11-16
                • 2011-04-12
                • 2015-12-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多