通过 wp-config.php 在 wordpress 上正确强制 SSL

更新于 2022年1月21日 wordpress教程

通过 wp-config.php 在 wordpress 上正确强制 SSL

如果我编辑wp-config.php我应该添加:

define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);

但是,我的网站有.htaccess规则,可以在整个网站上强制使用 https 和 www:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{SERVER_PORT} 80 [OR]
RewriteCond %{HTTP_HOST} ^website.com
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]

我知道还有其他重写器可用,但又不确定哪个是正确的。

我应该在wp-config.php使用以下哪三个

1 – 不带 isset(),带大括号,带 server_port

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS'] = 'on';
    $_SERVER['SERVER_PORT'] = 443;
}

2 – 没有大括号和没有 server_port?

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';

3 – 需要大括号/更好还是“更正确”并且需要 server_port 吗?

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS'] = 'on';
    $_SERVER['SERVER_PORT'] = 443;
}

我在互联网上发现了一些其他略有不同的关于 wordpress SSL 的变体,但我无法弄清楚哪个是正确的/主要的……

解决方案

解决方案

在这种情况下,PHP 代码根本不必处理 SSL。 这里应用了经典的SoC原则:如果您的代码没有明确地使用连接(在 WP 中它没有),您应该将协议检查留给 Web 服务器。

您还应该避免在重写规则中定义端口。 如果您不使用多站点 WP 设置,您可以尝试:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

我用过这个。 可以继续。

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
   $_SERVER['HTTPS']='on';

如果您的服务器端口与 443 不同,您可以指定它。 否则,无需再次使用它。

更正的 .htaccess 规则:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://mysslcertdomainname.com/$1 [R,L]

通常,Wordpress 不需要您的代码示例 (1,2,3),但看起来您有某种基于问题的代理。

  1. 不好如果 Web 服务器未设置HTTP_X_FORWARDED_PROTO生成 PHP 警告(标准 php 配置)。
  2. 在检查值之前, Good Checks 变量存在。 不产生警告。
  3. 最好**

** 作为一般规则,不鼓励更改_SERVER变量(如SERVER_PORTHTTPS ),除非您有一个不太常见的设置(即在代理后面 – 这是任何此代码的唯一原因)。

为此,我必须注释掉$_SERVER['HTTPS']='on';行周围的 if 语句行$_SERVER['HTTPS']='on';

我正在使用 Zevenet CE 5.9,它不提供 x-forwarded-for 或 x-forwarded-proto 的选项,因此为了将它放在反向代理后面,我们只是以这种方式强制 https :)。

如果您使用 docker 并避免手动配置(由人工),这对我有用:

if ( getenv('ENABLE_HTTPS')  === "true" ) {
  define( 'FORCE_SSL_ADMIN', true );
  $_SERVER['HTTPS']='on';
}

我只需要传递一个新变量ENABLE_HTTPS

docker run -d --name wordpress -it --rm -p 80:80 
-e DB_HOST=10.10.10.10:3306 
-e DB_USER=root 
-e DB_PASSWORD=secret 
-e DB_NAME=wordpress 
-e AUTH_KEY=$RANDOM_KEY 
-e SECURE_AUTH_KEY=$RANDOM_KEY 
-e NONCE_KEY=$RANDOM_KEY 
-e LOGGED_IN_KEY=$RANDOM_KEY 
-e AUTH_SALT=$RANDOM_KEY 
-e SECURE_AUTH_SALT=$RANDOM_KEY 
-e LOGGED_IN_SALT=$RANDOM_KEY 
-e NONCE_SALT=$RANDOM_KEY 
-e WP_DEBUG=true 
-e DISABLE_WP_CRON=true 
-e ENABLE_HTTPS=true wordpress:5.7.2

在functions.php中使用此代码

add_action('template_redirect', 'f_force_ssl');

function f_force_ssl()
{
    if (!is_ssl()) 
    {
        wp_redirect('https://' . $_SERVER['HTTP_HOST'] . 
        $_SERVER['REQUEST_URI'], 301);
        exit();
    }
}

你可能还喜欢下面这些文章

wordpress如何自定义短代码wordpress如何自定义短代码

短代码的用途很多,常见的场景有利用短代码来实现某一部分内容的特殊效果,或者在文章中插入自定义的一些特殊样式内容,或者隐藏某些内容等。首先在主题或者插件内定义一个短代码名称以及短代码所要输出的内容写文章的时候,输入将会出现Hello,。

如何在WordPress文本小工具中运行PHP代码如何在WordPress文本小工具中运行PHP代码

文件:add_filter('widget_text',。php_text($text)。$text;}之后,可以将一个文本小工具添加到侧边栏中,并在其中输入PHP函数代码,看看是不是可以正常运行了。

wordpress如何在一个页面显示所有文章wordpress如何在一个页面显示所有文章

></h3>。<li><a。>"><。></a></li>。get_categories();改为$cats。

wordpress去除index.php的方法wordpress去除index.php的方法

wordpress去除index.php的方法:首先登录wordpress后台。wordpress去掉index.php的方法主要有两个步骤:1-1)。/wordpress/index.php。

如何让WordPress媒体库识别.pdf文件如何让WordPress媒体库识别.pdf文件

Library)默认只支持图片、视频和音频,有时候这些是不够用的,媒体库允许上传的文件种类众多,需要更细化的分类,比如pdf文件让媒体库支持pdf分类这段来自tutsplus的代码可以帮助我们实现如上图所示的效果,将代码放到主题的functi

WordPress admin bar 添加自定义链接菜单WordPress admin bar 添加自定义链接菜单

bar中添加自定义链接菜单,您可以在主题的functions.php文件中添加代码。以下是一个示例代码,演示如何添加自定义链接菜单:在上述代码中,表示在admin。在这个示例中,我们添加了一个顶级菜单项,其ID为,标题为“自定义链接”,链接为

wordpress去除index.php的方法wordpress去除index.php的方法

wordpress去除index.php的方法:首先登录wordpress后台。wordpress设置固定链接登录wordpress后台,依次选择‘设置/固定链接,在出现的页面中,选择‘自定义结构’,然后根据你的情况,设置好链接。/wordp

WordPress上传文件自动重命名的方法WordPress上传文件自动重命名的方法

'git_upload_filter');代码二,用MD5加密生成数字并重命名名称规则是由系统自动生成的一个32位的MD5加密文件名,由于默认生成的32位文件名有点长,所以使用substr(md5($name),。pathinfo($file