WordPress SSL安全组证书配置后 后台正常 前台重定向死循环

2021.04.27 分享 2542 人浏览 留言

因迁移服务器,之前好几十个演示网站同时迁移,都使用cloudflare的完全模式+服务器安装ssl的模式工作量大,而且证书签发并发有限制,不能同时签这么多,所以改用Cloudflare的灵活模式+服务器不配SSL证书,遇到了一些问题,之前的方案无效,更新下最新方案。

Cloudflare配置灵活模式,关闭始终使用 HTTPS,开启自动 HTTPS 重写。其他默认(Total TLS关闭,密码套件关闭,最低 TLS 版本TLS1.0,随机加密开启,TLS 1.3开启,证书透明度监视关闭)

网站后台网址都改成http,wp-config.php删除WP_SITEURL,WP_HOME,FORCE_SSL_LOGIN所有配置,保持默认。

wp-config.php的<?php之后加上以下内容

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
define('FORCE_SSL_ADMIN', true);$_SERVER['HTTPS'] = 'on';
}

注意一定不能放到最后,会导致各种问题。可能和某个wordpress更新后,wp-settings.php的define('FORCE_SSL_ADMIN', true)冲突导致。

下面是调试的时候碰到的各种莫名其妙的问题

  1. 前台正常,后台正常,但登录后返回“抱歉,您不能访问此页面。” (没定义define('FORCE_SSL_ADMIN', true);或者放到后面导致)
  2. 前后台都重定向循环;(后台siteurl homeurl设置成https/http导致)
  3. 前台正常,后台重定向循环;(忘了什么原因了)
  4. 前台https可以访问,但图片加载失败;新旧版编辑器下返回Mixed Content(https混合内容)部分通过js和css加载的文件都是http模式加载的,导致无法编辑。(没设置$_SERVER['HTTPS'] = 'on';导致)

Cloudflare灵活模式的好处就是源站http不需要去配置证书,设置ssl的环境,直接加两行代码搞定,不用去考虑证书收费,自动续签问题。网站数量多的话,省事太多了。坏处就是Cloudflare->服务器之间的通讯是http的,非加密,但感觉问题不大,客户端->Cloudflare之间的通讯是加密的。

下面是旧版本的一些记录:

不知道什么原因,一般wordpress开启ssl都是很简单的,但是有时候还是会碰到莫名其妙的死循环。往上google 百度了一大圈,看别人都是前台https访问正常,后台访问重定向死循环,他们的解决方法是装 Really Simple SSL 插件 或者修改wp-config.php配置

$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

但这个对我这个问题没什么卵用。

后面搜了一大圈,最终找到解决方案,至于原因不明(个人猜测是网站本地部署后,搬移到线上配置问题,导致template_redirect函数死循环,但http又没什么问题),这里记录下修改方法。

注释 wp-include/template-loader.php 13行 do_action( 'template_redirect' );即可。

同时附上开启全站ssl的.htaccess代码

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

Cloudflare中死循环

服务器自己装证书,然后再开cloudflare SSL,模式选full

wp-config.php加$_SERVER['HTTPS']='on'; ->这个不确定需不需要

貌似用cloudflare的证书,然后打开Always Use HTTPS也是可以

 

还有一个原因就是安装 memcached 和 object-cache.php后,是缓存内存数据库的时候,数据库前缀都是同一个(默认的_wp)导致。

解决方案:

  1. 修改数据库表前缀

    以wp_前缀改成_hl为例 执行以下SQL

    RENAME TABLE wp_comments TO hl_comments;

    RENAME TABLE wp_commentmeta TO hl_commentmeta;

    RENAME TABLE wp_links TO hl_links;

    RENAME TABLE wp_options TO hl_options;

    RENAME TABLE wp_postmeta TO hl_postmeta;

    RENAME TABLE wp_posts TO hl_posts;

    RENAME TABLE wp_terms TO hl_terms;

    RENAME TABLE wp_termmeta TO hl_termmeta;

    RENAME TABLE wp_term_relationships TO hl_term_relationships;

    RENAME TABLE wp_term_taxonomy TO hl_term_taxonomy;

    RENAME TABLE wp_usermeta TO hl_usermeta;

    RENAME TABLE wp_users TO hl_users;

    UPDATE hl_options SET option_name = REPLACE(option_name, 'wp_', 'hl_') WHERE option_name LIKE 'wp_%';

    UPDATE hl_usermeta SET meta_key = REPLACE(meta_key, 'wp_', 'hl_') WHERE meta_key LIKE 'wp_%';


    然后在wp-conconfig.php中修改对应的前缀 $table_prefix = 'hl_';

    注意看有没有其他插件生成的表,需要额外替换

  2. 在不同站点的 wp-config.php 文件定义不同的 WP_CACHE_KEY_SALT 值,
    define('WP_CACHE_KEY_SALT', 'xxx'); //不同站设成不一样

文章地址:http://huilang.me/wordpress-ssl-redirect-loop/

回复本文

您的邮箱地址不会被公开。 必填项已用 * 标注

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif