【问题标题】:Use .htaccess to redirect HTTP to HTTPs使用 .htaccess 将 HTTP 重定向到 HTTPS
【发布时间】:2015-11-10 01:21:30
【问题描述】:

请不要向我推荐超过 173 票的long and very detailed thread。它对我不起作用。我还尝试了很多其他方法(1234)。他们都给我 TOO_MANY_REDIRECTS 或错误 500。所以,这是我的问题:

使用我当前的 .htaccess,会发生以下情况:

https://www.dukescasino.com/ - 完美运行

https://dukescasino.com/ - 重定向到上面这很棒

以下两个选项加载正常,但应该重定向到 https 版本:

http://www.dukescasino.com/

http://dukescasino.com/

这是当前的 .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

我不认为它是相关的,但如果是这样,这里是当前活动插件的列表:

  • 高级自定义字段
  • 一站式搜索引擎优化包
  • 导航菜单的 Bop 搜索框项目类型
  • 联系表格 7
  • 禁用评论
  • Google XML 站点地图
  • WordPress.com 的 Jetpack
  • 搜索和过滤
  • 滑块 WD
  • 桌布
  • UpdraftPlus - 备份/恢复
  • Wordfence 安全性
  • WPide
  • WP Smush
  • WP 超级缓存

编辑 1 - 执行的测试:

测试 A:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

结果: ERR_TOO_MANY_REDIRECTS

测试 B:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

结果: ERR_TOO_MANY_REDIRECTS

测试 C:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{SERVER_PORT} ^80$
 RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

结果: ERR_TOO_MANY_REDIRECTS

测试 D:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

结果: ERR_TOO_MANY_REDIRECTS

测试 E:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

结果: 302 找到。此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。

【问题讨论】:

  • 也许只是一个错字,但你已经拼错了.htaccess 3 次(同样的方式)?您当前的 .htaccess 文件不完整,您缺少 RewriteEngine On 指令。据推测,当您添加规范重定向时,您会将其添加到 .htaccess 文件的最顶部?您声明 https://example.com 重定向 OK,但是,您的配置文件中没有说明?这是在哪里/如何发生的?了解您实际尝试过的内容会很有用 - 那是行不通的。
  • 抱歉,.htaccess 是一个错字,我现在已经修正了。我还更新了当前的 .htaccess 代码以及我对每个结果所做的所有测试。我不知道没有 www 的 https 是如何重定向到 www 版本的。谢谢
  • 您通常希望设置服务器变量HTTPS(您的结果表明并非如此)。你在代理后面吗? (测试 E 可能会导致某种“递归”404?)
  • 我刚刚联系了 123-reg(托管公司),以检查他们是否有任何搞砸的东西。即使我有工作的 .htaccess 并在他们的 (123reg) 控制面板中设置重定向工具,我也会得到 ERR_TOO_MANY_REDIRECTS。

标签: wordpress .htaccess http redirect https


【解决方案1】:

问题解决了!

最终的.htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

【讨论】:

  • 对于我在 Dreamhost 上托管的域,此更改导致“[www.domain.com] 将您重定向太多次”。没有运气。但是,这有效: RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 我不得不将RewriteCond 更改为以下一个以避免too many redirectsRewriteCond %{HTTPS} !=on
  • 对我来说 virtualmin apache 2.4 造成了禁止。 @jason-shah 的解决方案奏效了。
  • 对我不起作用。此解决方案将“您重定向太多次”。铬说。
  • 这是唯一对我有用的解决方案。 (测试太多了。)“ENV:”至关重要。从回复和其他解决方案来看,似乎在某些主机上您必须包含它,而在其他主机上您必须将它排除在外。顺便说一句,对于任何想要使用它的人,请考虑使用 R=301 而不仅仅是 R(这意味着 302 重定向)。
【解决方案2】:

在 Dreamhost 上,这很有效:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

【讨论】:

  • 这个在namecheap共享主机上为我工作。
  • 也在 asmallorange.com 上工作过
  • 在提供者 Time4VPS 上使用 Wordpress 4.7.4 在 LAMP 服务器上为我工作
  • 确保规则的准确顺序正确。我已将重写规则置于现有的 WordPress 规则下,但随后仅重新路由了根域,而没有任何 HTTP URI 请求。高于现有 WordPress 规则的正确排序正确地路由所有 HTTP 请求。
  • 没有必要指出这适用于每一个主机!这是 .htaccess 的一段简单代码,因此它应该适用于大多数接受 .htaccess 的系统。如果它不起作用,那是因为一个奇怪的情况。
【解决方案3】:

很遗憾,我发现此问答中列出的所有解决方案都不适合我。起作用的是:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^/?$ "https\:\/\/www\.example\.com\/" [R=301,L]
</IfModule>
# End Wordpress

注意,以上 Wordpress 规则适用于多用户网络模式下的 Wordpress。如果您的 Wordpress 处于单站点模式,您将使用:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^/?$ "https\:\/\/www\.example\.com\/" [R=301,L]
</IfModule>
# End Wordpress

【讨论】:

    【解决方案4】:

    它对我有用:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} !on           
    RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    
    # END WordPress
    

    【讨论】:

      【解决方案5】:

      在我的例子中,htaccess 文件包含许多由插件安装的规则,如 Far Future ExpirationWPSuperCache 以及 wordpress 本身的行。

      为了不把事情搞砸,我不得不把解决方案放在 htaccess 的顶部(这很重要,如果你把它放在最后,由于与缓存插件冲突会导致一些错误的重定向)

      <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      
      RewriteCond %{HTTPS} off
      RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
      </IfModule>
      

      这样,您的行不会被 wordpress 弄乱,以防某些设置发生变化。此外,&lt;IfModule&gt; 部分可以毫无问题地重复。

      我要感谢Jason Shah 的整洁htaccess rule

      【讨论】:

      • 这是基本信息。感谢发布!
      【解决方案6】:

      以上没有对我有用。但是这些行在我的 WordPress 网站上解决了同样的问题:

      RewriteEngine On
      
      RewriteCond %{HTTP:HTTPS} !on
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      

      【讨论】:

        【解决方案7】:

        如果您不想编辑.htaccess,可以使用以下替代解决方案:

        add_action( 'template_redirect', 'nonhttps_template_redirect', 1 );
        
        function nonhttps_template_redirect() {
        
            if ( is_ssl() ) {
        
                if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'https' ) ) {
        
                    wp_redirect( preg_replace( '|^http://|', 'https://', $_SERVER['REQUEST_URI'] ), 301 );
        
                    exit();
        
                } else {
        
                    wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
        
                    exit();
        
                }
        
            }
        
        }
        

        你可以把它放在你的主题底部functions.php

        【讨论】:

        • 还不完全确定,我猜它会保持不变,这取决于 Google 可能将其作为 HTTPS 版本开始索引的原因。
        【解决方案8】:

        只需添加此代码,它就会像魅力一样工作:

        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{HTTP_HOST}#%{HTTPS}s ^www\.([^#]+)#(?:off|on(s)) [NC]
            RewriteRule ^ http%2://%1%{REQUEST_URI} [R=301,L]
        </IfModule>
        

        【讨论】:

          【解决方案9】:

          这是经过测试的,可以安全使用

          为什么?:当 Wordpress 编辑您的重写规则时,请确保您的 HTTPS 规则不应被删除!所以这与原生 Wordpress 规则没有冲突

          <IfModule mod_rewrite.c>
             RewriteCond %{HTTPS} !=on
             RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
          </IfModule>
          
          # BEGIN WordPress
          <IfModule mod_rewrite.c>
            #Your our Wordpress rewrite rules...
          </IfModule>
          # END WordPress
          

          注意:您必须在常规设置中将WordPress地址站点地址网址更改为https://还有(wp-admin/options-general.php

          【讨论】:

          • WordPress 部分应该在 HTTPS 之后,否则它将无法工作。或者,至少,这就是发生在我身上的事情 :)
          • 确认@Ste_95 所说的。我必须将 HTTPS 重写块放在默认的 WP 永久链接配置之前。
          【解决方案10】:

          将此添加到 WordPress 的 .htaccess 文件中:

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

          因此,默认的 WordPress 的 .htaccess 文件应如下所示:

          <IfModule mod_rewrite.c>
          RewriteEngine On
          RewriteBase /
          RewriteRule ^index\.php$ - [L]
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteRule . /index.php [L]
          
          RewriteCond %{HTTP_HOST} ^yoursite.com [NC,OR]
          RewriteCond %{HTTP_HOST} ^www.yoursite.com [NC]
          RewriteRule ^(.*)$ https://www.yoursite.com/$1 [L,R=301,NC]
          </IfModule>
          

          【讨论】:

            【解决方案11】:

            上面的最终 .htaccess 和测试 A、B、C、D、E 对我不起作用。我只使用了以下 2 行代码,它在我的 WordPress 网站中运行:

            RewriteCond %{SERVER_PORT} 80 
            RewriteRule ^(.*)$ https://www.thehotskills.com/$1 [R=301,L]
            

            我不确定我在哪里犯了错误,但这个页面帮助了我。

            【讨论】:

              【解决方案12】:
              <IfModule mod_rewrite.c>
                  RewriteEngine On
                  RewriteBase /
                  RewriteCond %{HTTPS} !=on
                  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
                  RewriteEngine On
                  RewriteCond %{HTTP_HOST} ^digitalsoftwaremarket.com [NC]
                  RewriteRule ^(.*)$ http://www.digitalsoftwaremarket.com/$1 [L,R=301]
              </IfModule>
              

              【讨论】:

                【解决方案13】:

                wordpress 中将 http 重定向到 https 的最简单方法是将 site_url 和 home 从 http://example.com 修改为 https://example.com。 Wordpress 将进行重定向。 (这就是为什么你得到“重定向太多”错误,wordpress 重定向到 http 而 .htaccess 将重定向到 https)

                【讨论】:

                • 我不确定它是否会对 SEO 进行任何重定向 :)
                • 确实如此。重定向 301(永久),谷歌将重新索引
                • 请记住,这不适用于 Google Search Console!
                • 它会工作得很好...... wordpress 会做一个重定向(301)。请记住这一点:rtfm
                【解决方案14】:

                供您参考,这实际上取决于您的托管服务提供商。

                在我的情况下 (Infomaniak),上面没有任何实际工作,我得到了无限重定向循环。

                正确的做法是actually explained in their support site:

                RewriteEngine on
                RewriteCond %{HTTP:X-Forwarded-Proto} !https
                RewriteRule (.*) https://your-domain.com/$1 [R=301,L]
                

                因此,请务必咨询您的托管服务提供商。希望他们有一篇文章解释如何做到这一点。否则,请寻求支持。

                【讨论】:

                  【解决方案15】:

                  如果这对我有用,则没有。首先,我必须查看我的提供商,看看他们如何在.htaccess 我的提供商提供的 SSL 中激活

                  <IfModule mod_rewrite.c>
                     RewriteEngine On
                     RewriteCond %{HTTP:HTTPS} !on
                     RewriteRule (.*) https://%{SERVER_NAME}/$1 [QSA,L,R=301]
                  </IfModule>
                  

                  但我花了几天时间研究的是我必须在wp-config.php 中添加以下行,因为我提供的网站位于代理后面:

                  /**
                   * Force le SSL
                   */
                  define('FORCE_SSL_ADMIN', true);
                  if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) $_SERVER['HTTPS']='on';
                  

                  【讨论】:

                    【解决方案16】:

                    只需在 wordpress 中的 .htaccess 文件中添加或替换此代码

                    # BEGIN WordPress
                    <IfModule mod_rewrite.c>
                    RewriteEngine On
                    RewriteBase /
                    
                    RewriteCond %{HTTPS} !=on
                    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
                    
                    RewriteRule ^index\.php$ - [L]
                    RewriteCond %{REQUEST_FILENAME} !-f
                    RewriteCond %{REQUEST_FILENAME} !-d
                    RewriteRule . /index.php [L]
                    </IfModule>
                    
                    # END WordPress
                    

                    【讨论】:

                      【解决方案17】:

                      从http重定向到https://www

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

                      这肯定行得通!

                      【讨论】:

                        猜你喜欢
                        • 2019-03-18
                        • 2012-10-11
                        • 2018-08-31
                        • 2012-11-02
                        • 1970-01-01
                        • 2015-02-16
                        • 1970-01-01
                        • 2015-12-06
                        • 2018-02-02
                        相关资源
                        最近更新 更多