使用 .htaccess 将 HTTP 重定向到 HTTPS

Posted

技术标签:

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

请不要向我推荐超过 173 票的long and very detailed thread。它对我不起作用。我还尝试了很多其他方法(1、2、3、4)。他们都给我 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。 【参考方案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#%HTTPSs ^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]

这肯定行得通!

【讨论】:

以上是关于使用 .htaccess 将 HTTP 重定向到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用 .htaccess 将所有 url 重定向到 1 个 url

使用 .htaccess 将 http 重定向到 https 时,某些 url 出现奇怪的 401 错误

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

使用 htaccess 将多个域(http https www 和非 www)重定向到新域

使用 htaccess 将请求 uri 重定向到镜像站点

http到https重定向使用htaccess在角度6中不起作用