【问题标题】:Generic htaccess redirect www to non-www通用 htaccess 将 www 重定向到非 www
【发布时间】:2017-02-12 12:47:11
【问题描述】:

我想将www.example.com 重定向到example.com。以下 htaccess 代码实现了这一点:

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

但是,有没有办法以通用方式执行此操作而无需对域名进行硬编码?

【问题讨论】:

  • 请务必注意,如果您不使用 www(或其他子域),那么所有 cookie 都将提交到每个子域,并且您将无法拥有无 cookie用于提供静态内容的子域,从而减少了浏览器和服务器之间来回发送的数据量。你以后可能会后悔的事情:twitter.com/codinghorror/statuses/1637428313
  • 另一件需要考虑的事情,确保您在页面中设置的规范名称没有 www,以避免可能的重复内容惩罚。此外,如果您的链接中有绝对网址,请确保它们也都是非 www。
  • 我认为最好保留显式重定向,尤其是在复制另一个域的配置时,这可能需要不同的调整(在某些情况下 www 域更好)weboptimizer.ch/2014/01/redirection-www
  • 为什么这个解决方案适用于除根 url 之外的所有情况?例如domain.com 不会指向domain.com,而domain.com/page1 会重定向到domain.com/page1
  • 如果您希望在维护协议(HTTP 或 HTTPS)的同时将 www 重定向到非 www,请查看此相关问题:Redirecting www to non-www while maintaining the protocol HTTP or HTTPS

标签: .htaccess redirect mod-rewrite url-rewriting http-status-code-301


【解决方案1】:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Michael's 相同,除了这个有效:P

【讨论】:

  • 如果它不起作用,您可能缺少RewriteEngine On 前体使其起作用。
  • @Ben,我将如何反向使用它,将 www 添加到非 www 网站?
  • 它将http://www.domain.com/ 重定向到http://domain.com//。您应该将/ 添加到RewruteRule。这对我有用RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]
  • 我遇到了与 Vladimir 相同的问题,因为它使用双斜杠重定向到 http://domain.com//。所以我做了RewriteRule ^(.*)$ http://%1$1 [R=301,L],到目前为止它似乎正在工作
  • 请使用以下解决方案而不是重写引擎,它在优雅的同时更快:stackoverflow.com/questions/1100343/…
【解决方案2】:

但如果我们需要对单独的 http 和 https 执行此操作:

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

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

【讨论】:

  • www.example.com/ 重定向到 example.com// 有什么办法可以去掉多余的斜线?
  • 好问题。我想快速的解决方案是在上述这些之前使用额外的规则(即仅适用于这种情况)。例如:RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
  • @BobbyS 我使用了this article 中的解决方案。它将 www 和 HTTP 重定向到非 www HTTPS 并处理尾随 /
  • 如果您将这些指令直接放在服务器配置(或虚拟主机)中,您只会得到一个额外的斜杠(在 URL 路径的开头)。在.htaccess 中,您不应该得到额外的斜线。 (请注意,如果您在服务器配置中执行此重定向,那么您可能不应该使用 mod_rewrite 开始......在适当的 vhost 容器中使用简单的 mod_alias Redirect 会更有效且不易出错.)
【解决方案3】:

非www重定向到www(两者:http + https)

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

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

【讨论】:

  • @nightcoder 这是因为我的反向重定向解决方案(从非 www 到 www)而不是 Andron 的
  • 注意:如果您打算将子域名用于其他目的,此解决方案可能会导致一些问题。例如,app.yourdomain.com 将被重定向到 www.app.yourdomain.com。
  • 这与问题的答案完全相反。
  • 我必须添加 RewriteEngine OnRewriteBase /,但除此之外效果很好。
【解决方案4】:

如果您想在 httpd.conf 文件中执行此操作,您可以不使用 mod_rewrite 执行此操作(显然它对性能更好)。

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

我在这里得到了答案:https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507

【讨论】:

    【解决方案5】:

    以下是将 www URL 重定向到 no-www 的规则:

    #########################
    # redirect www to no-www
    #########################
    
    RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
    RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]
    

    以下是将无 www 的 URL 重定向到 www 的规则:

    #########################
    # redirect no-www to www
    #########################
    
    RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
    RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]
    

    请注意,我使用NE 标志来防止 apache 转义查询字符串。如果没有这个标志,apache 会将请求的 URL http://www.example.com/?foo%20bar 更改为 http://www.example.com/?foo%2250bar

    【讨论】:

    • 你能不能写代码把http重定向到https以及把www重定向到非www
    • 将 http:// 更改为 https:// 以在更改时将其强制为 HTTPS。您还需要为未被这些规则重定向的流量添加常规 http->https 重定向。
    【解决方案6】:
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^/(.*)$ https://%1/$1 [R]
    

    RewriteCondwww. 之后 捕获HTTP_HOST 变量中的所有内容并将其保存在%1 中。

    RewriteRule 捕获不带前导 / 的 URL,并将其保存在 $1 中。

    【讨论】:

    • sans leading "/" - 在.htaccess(如问题中所述)中没有前导/,因此该模式永远不会匹配并且重定向永远不会发生。 (在 servervirtualhost 上下文中只有一个前导斜杠。)此外,如果您在此之后有任何 mod_rewrite 指令,那么您将需要 L 标志。
    【解决方案7】:

    试试这个:

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

    如果主机以www开头,我们将整个主机粘贴到URL的开头,然后去掉“www”。

    【讨论】:

    • RoBorg,不幸的是你的设置不起作用,如果我尝试这个:example.com/hello/world 我最终在这里:example.com/hello/world/world 我还必须在第一个 RewriteRule 中的 %{HTTP_POST} 之后添加一个斜杠
    • 我使用的是 Apache/2.2.9 (Unix)。它适用于重定向到网站的 www.website 但对于以下内容:website/test -> 转到:websitetest 我通过添加另一个 / 第二个错误来解决此问题:website/test/n 转到 websitetest/n/n
    • 这个问题与@deepwell 相同。
    • 早期读者遇到的问题是因为这些指令用于服务器配置(或虚拟主机),而不是.htaccess。在 目录 上下文 (.htaccess) 中,您应该将第一个 RewriteRule 更改为:RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](需要 Apache 2.2.12+)。请注意添加斜杠和DPI(丢弃路径信息)标志 - 以防止部分 URL 路径看似重复(实际上是“路径信息”),如前面的 cmets 所述。但是,有一些更简单的指令 - 如其他答案所述。
    【解决方案8】:

    完整的通用 WWW 处理程序,http/https

    我没有看到完整的答案。我用它来处理 WWW 包含。

    1. 通用。不需要域信息。
    2. 在主域上强制使用 WWW:www.domain.com
    3. 删除子域上的 WWW:sub.domain.com
    4. 保留 HTTP/HTTPS 状态。
    5. 允许域/子域的单个 cookie

    请告诉我这是如何工作的,或者我是否留下了漏洞。

    RewriteEngine On
    RewriteBase /
    
    # Force WWW. when no subdomain in host
    RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
    RewriteCond %{HTTPS}s ^on(s)|off [NC]
    RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # Remove WWW. when subdomain(s) in host     
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteCond %{HTTPS}s ^on(s)|off [NC]
    RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
    RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
    

    【讨论】:

    • 原始问题要求将www 重定向到非www。您正在强制包含 www
    • 这是唯一对我有用的解决方案,包括文件夹和子文件夹。我正在使用 .htaccess
    【解决方案9】:

    我发现有很多关于 htaccess 重定向的错误信息。首先,确保您的站点在使用 Apache 的 Unix 上运行,而不是在 Windows 主机上运行(如果您希望此代码能够工作)。

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

    (不过,请确保每行文本之间没有行间距;我在行之间添加了一个额外的空格,以便在此窗口中呈现正常。)

    这是一个sn-p 代码,可用于将您网站的www 版本指向http:// 版本。还有其他类似的代码也可以使用。

    【讨论】:

      【解决方案10】:
      RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
      RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]
      

      对于子文件夹

      【讨论】:

        【解决方案11】:

        对于那些需要能够访问整个网站的人没有'www'前缀。

        RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
        RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
        

        请确保将其添加到以下文件中

        /site/location/.htaccess 
        

        【讨论】:

        • 此示例不完整 - 您没有设置 protossl 环境变量(这不是标准/服务器变量)。这将始终为空,因此将始终重定向到 http。 (在代码前面设置protossl 背后的想法是当您希望在重定向时保留协议。但是,这些天您可能应该一直重定向到https。)
        【解决方案12】:

        使用 .htaccess 重定向到 www 或非 www:

        只需将以下代码行放入您的主根 .htaccess 文件中。 在这两种情况下,只需将 domain.com 更改为您自己的主机名即可。

        重定向到 www

        <IfModule mod_rewrite.c>
          RewriteEngine on
          RewriteCond %{HTTP_HOST} ^domain\.tld [NC]
          RewriteRule ^(.*)$ http://www.domain.tld/$1 [L,R=301]
        </IfModule>
        

        重定向到非www

        <IfModule mod_rewrite.c>
          RewriteEngine on
          RewriteCond %{HTTP_HOST} ^www\.domain\.tld [NC]
          RewriteRule ^(.*)$ http://domain.tld/$1 [L,R=301]
        </IfModule>
        

        【讨论】:

        • "将 DOT 更改为 => . !!!" - 为什么不首先写一个.?!
        【解决方案13】:

        我使用上面的规则将 www 转发到没有 www,它在主页上工作正常,但是在他们转发到 /index.php 的内部页面上

        我在我的 .htaccess 文件中发现了另一个导致此问题的规则,但不知道该怎么做。任何建议都会很棒:

        ############################################
        ## always send 404 on missing files in these folders
        
            RewriteCond %{REQUEST_URI} !^/(media|skin|js)/
        
        ############################################
        ## never rewrite for existing files, directories and links
        
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-l
        
        ############################################
        ## rewrite everything else to index.php
        
            RewriteRule .* index.php [L]
        

        【讨论】:

        • 您需要在您引用的那些之前放置非www重定向规则。
        【解决方案14】:

        使用 https 从 www 到非 www

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

        【讨论】:

          【解决方案15】:
          RewriteEngine on
          # if host value starts with "www."
          RewriteCond %{HTTP_HOST} ^www\.
          # redirect the request to "non-www"
          RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]
          

          如果您想同时删除 httphttps 上的 www,请使用以下命令:

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

          这会重定向 非ssl

          并且 SSL

          在 apache 2.4.* 上,您可以使用 Redirectif 指令来完成此操作,

          <if "%{HTTP_HOST} =='www.example.com'">
          Redirect / http://example.com/
          </if>
          

          【讨论】:

            【解决方案16】:

            使用:Javascript / jQuery

            // similar behavior as an HTTP redirect
            window.location.replace("http://www.stackoverflow.com");
            // similar behavior as clicking on a link
            window.location.href = "http://stackoverflow.com";
            

            或.htaccess:

            RewriteEngine On
            RewriteBase /
            Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
            RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]
            

            和 PHP 方法:

            $protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";
            
            if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
                header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
                exit;
            }
            

            阿贾克斯

            $.ajax({
                type: "POST",
                url: reqUrl,
                data: reqBody,
                dataType: "json",
                success: function(data, textStatus) {
                    if (data.redirect) {
                        // data.redirect contains the string URL to redirect to
                        window.location.href = data.redirect;
                    }
                    else {
                        // data.form contains the HTML for the replacement form
                        $("#myform").replaceWith(data.form);
                    }
                }
            });
            

            【讨论】:

              【解决方案17】:

              我让它工作的唯一方法......

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

              【讨论】:

                【解决方案18】:

                如果您强制使用 www.在 url 或强制 ssl 协议中,然后尝试在 htaccess 文件中使用可能的变体,例如:

                重写引擎开启 RewriteBase / ### 强制万维网### RewriteCond %{HTTP_HOST} ^example\.com 重写规则 (.*) http://www.example.com/$1 [R=301,L] ## 强制 SSL ### RewriteCond %{SERVER_PORT} 80 重写规则 ^(.*)$ https://example.com/$1 [R,L] ##阻止IP的### 订单拒绝,允许 拒绝来自 256.251.0.139 拒绝来自 199.127.0.259

                【讨论】:

                • Apache 可以监听另一个端口,例如81. 所以我建议不要使用RewriteCond %{SERVER_PORT} 80,而是使用这样更通用的检查:RewriteCond %{HTTPS} off
                【解决方案19】:

                更新后可在 Apache 2.4 上运行:

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

                Michael's 的唯一变化是删除[NC],这会产生“AH00665”错误:

                不支持非正则表达式模式“-f”的 NoCase 选项,将被忽略

                【讨论】:

                • 较早的答案不需要“更新以在 Apache 2.4 上工作”。您引用的“警告”(AH00665)与不同的指令相关(例如,如果您有类似RewriteCond %{REQUEST_FILENAME} !-f [NC] 的东西)。 NC 标志在上面几乎没有什么区别,但是,NC 标志应该在这里使用的原因是捕获一小部分(错误地)发送大写主机名的机器人流量。
                【解决方案20】:

                这里选择的答案和许多其他解决方案在 / 之后删除了 url 的部分,所以基本上它总是重定向到主域,至少对我来说是这样。所以我在斜杠后添加了关于完整路径的工作示例..

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

                【讨论】:

                  【解决方案21】:

                  如果 .htaccess 自定义不是理想的选择,则另一种方法:

                  我创建了简单的重定向服务器供公众使用。只需添加 A 或 CNAME 记录:

                  CNAME   r.simpleredirect.net
                  A       89.221.218.22
                  

                  更多信息:https://simpleredirect.net

                  【讨论】:

                  • 该网站现在显示“此服务将很快关闭。”
                  【解决方案22】:

                  我不确定你为什么要删除 www。 但反向版本是:

                  # non-www.* -> www.*, if subdomain exist, wont work
                  RewriteCond %{HTTP_HOST} ^whattimein\.com
                  RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]
                  

                  这个脚本的优点是: 如果你有类似 test.whattimein.com 或其他任何东西(开发/测试环境) 它不会将 U 重定向到原始环境。

                  【讨论】:

                  • 是否应包含 www 子域实际上是个人喜好问题,可能取决于域名和目标受众。上面发布的用于将 www 重定向到 none-www 的通用代码也可以处理测试环境,因为重定向仅在“www.”时发生。遇到子域。
                  • 这个问题与用户的要求相反,只会污染帖子。
                  【解决方案23】:

                  如果是本地主机,则添加忽略重定向(用于本地环境中的开发目的)。如果不是 localhost AND(不是 https 或者是 www),则重定向到 https 和非 www。

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

                  【讨论】:

                  • 请详细说明您的代码,以便 OP 了解它如何回答问题。
                  【解决方案24】:

                  您好,您可以在您的 htaccess 文件中使用以下规则:

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

                  【讨论】:

                  • 问题是要求一个不包括域名的“通用”解决方案。您的解决方案也与问题中所要求的内容(非 www 到 www,而不是 www 到非 www)完全相反,没有解释。
                  猜你喜欢
                  • 2012-11-16
                  • 2011-04-12
                  • 2015-12-31
                  • 1970-01-01
                  • 2012-10-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多