使用.htaccess将HTTP重定向到HTTPS

82
我已经尝试了这篇文章,以及其他很多篇文章(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>

我不认为这是相关的,但如果是的话,这是目前活跃插件的列表:
- Advanced Custom Fields - All In One SEO Pack - Bop Search Box Item Type For Nav Menus - Contact Form 7 - Disable Comments - Google XML Sitemaps - Jetpack by WordPress.com - Search & Filter - Slider WD - TablePress - UpdraftPlus - Backup/Restore - Wordfence Security - WPide - WP Smush - WP Super Cache 测试已执行:
测试 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>

Result: ERR_TOO_MANY_REDIRECTS

Test 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>

Result: ERR_TOO_MANY_REDIRECTS

Test 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 内部服务器错误。


可能只是一个打字错误,但是你已经连续三次拼错了 .htaccess 的拼写?你当前的 .htaccess 文件不完整,缺少 RewriteEngine On 指令。当你添加规范重定向时,你将其添加到 .htaccess 文件的顶部吗?你说 https://example.com 重定向正常,但是在你的配置文件中并没有表明?这是在哪里/如何发生的?知道你实际尝试过什么会很有用 - 而这些却没有起作用。 - MrWhite
抱歉,.htaccess 是个笔误,我已经修正了。我也更新了当前的 .htaccess 代码,并测试了每一个结果。不过我不知道如何将没有 www 的 https 重定向到 https://www 版本。谢谢。 - Cristiano Maia
通常您会期望服务器变量 HTTPS 被设置(您的结果表明不是这样)。您是否在代理后面?(测试 E 很可能会导致某种形式的“递归” 404?) - MrWhite
我刚刚联系了123-reg(托管公司),以检查他们是否在他们的一侧设置了任何会搞砸事情的东西。即使我有工作的.htaccess文件并在他们(123reg)的控制面板中设置了重定向工具,我仍然会遇到ERR_TOO_MANY_REDIRECTS错误。 - Cristiano Maia
17个回答

145

在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>

1
这个对我在Namecheap共享主机上运行有效。 - Liakat Hossain
1
也在asamllorange.com上工作过。 - Leonardo Herrera
确保准确获取规则的顺序。我已经将重写规则放在现有的WordPress规则下面,但是只有根域重定向,而没有任何HTTP URI请求。在现有的WordPress规则之上正确排序可以正确路由所有HTTP请求。 - delrocco
3
无需指出此代码适用于每个主机!这是一段针对 .htaccess 的简单代码,因此它应该适用于大多数支持 .htaccess 的系统。如果它不起作用,则可能是因为某种奇怪的情况。 - Phill Healey
在Godaddy的共享主机上工作得非常好! - christostsang
显示剩余3条评论

93

问题已解决!

最终的 .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>

19
这个更改导致我在Dreamhost托管的一个域名出现了“[www.domain.com]重定向次数过多”的问题。没有运气。 然而,这个方法是可以的: RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - Jason Shah
11
为了避免“重定向过多”的问题,我只需将RewriteCond更改为以下内容:RewriteCond %{HTTPS} !=on - lucaferrario
只需添加这两行代码。非常好用!谢谢.. RewriteCond %{ENV:HTTPS} !=on RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L] - Melroy van den Berg
@zhekaus,您还需要在wp_options表中更改“siteurl”和“home”选项的值,将其从http://更改为https://。 - john p
3
这是唯一一个对我有效的解决方案。(测试了太多次了。)"ENV:" 很关键。从回复和其他解决方案中可以看出,在某些主机上您必须包括它,而在其他主机上则必须省略它。另外,如果有人想使用这个方法,请考虑使用 R=301 而不是只使用 R(即 302 重定向)。 - Vit Kovalcik
显示剩余3条评论

15

对我来说有效:

# 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

13
在我的情况下,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规则


这是必要的信息。感谢您发布它! - Henrik Petterson

4

需要说明的是,这实际上取决于您的主机提供商。

就我个人而言(Infomaniak),以上方法都不起作用,我一直处于无限重定向循环中。

正确的方法是在他们的支持网站上详细解释了如何操作

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

因此,始终与您的主机提供商核对。希望他们有一篇文章来解释如何做到这一点。否则,只需询问支持即可。


4

这是经过测试并且安全可用的

为什么: 当 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地址网站地址的URL更改为https://(位于wp-admin/options-general.php


WordPress部分应该放在HTTPS之后,否则它将无法工作。或者至少对我来说是这样的 :) - Ste_95
确认 @Ste_95 所说的。我必须将 HTTPS 重写块放在默认的 WP 永久链接配置之前。 - Justin Tilson

1
最简单的将WordPress网站从http重定向到https的方法是修改site_url和home地址,将http://example.com改为https://example.com。WordPress会自动进行重定向。(这也是你出现“太多重定向”错误的原因,WordPress会重定向到http,而.htaccess会重定向到https)

我不确定它是否对SEO进行任何重定向 :) - jcdarocha
1
当然可以。重定向301(永久性),谷歌会重新索引。 - Rafael
请记住,这不适用于Google搜索控制台! - Hexodus
它会正常工作的... WordPress 将执行重定向 (301)。记住这一点:RTFM。 - Rafael

1
我发现在这个问答中列出的所有解决方案对我都不起作用,不幸的是。真正有效的方法是:
# 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

1

以上的方法都对我无效。但是以下这些代码解决了我WordPress网站上的同样问题:

RewriteEngine On

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

0
将以下内容添加到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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接