使用 .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 redirects
:RewriteCond %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 Expiration 和 WPSuperCache 以及 wordpress 本身的行。
为了不把事情搞砸,我不得不把解决方案放在 htaccess 的顶部(这很重要,如果你把它放在最后,由于与缓存插件冲突会导致一些错误的重定向)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %HTTPS off
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
</IfModule>
这样,您的行不会被 wordpress 弄乱,以防某些设置发生变化。此外,<IfModule>
部分可以毫无问题地重复。
我要感谢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