如何通过 wp-config.php 在 WordPress 上正确强制使用 SSL?

问题描述 投票:0回答:6

如果我编辑

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

中使用以下 3 个中的哪一个
  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 wordpress .htaccess ssl https
6个回答
15
投票

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

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

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

12
投票

我用过这个。继续下去就好了。

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

如果您的服务器端口与 443 不同。您可以指定它。否则的话,就没有必要再次使用了。


5
投票

更正了 .htaccess 规则(详见 wiki.apache.org):

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

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

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

** 作为一般规则,不鼓励更改

_SERVER
变量(如
SERVER_PORT
HTTPS
),除非您有一个不太常见的设置(即在代理后面 - 这是任何此代码的唯一原因).


3
投票

如果您使用 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

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();
    }
}

0
投票

为了让这个对我有用,我必须注释掉该行周围的 if 语句行

$_SERVER['HTTPS']='on';

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

© www.soinside.com 2019 - 2024. All rights reserved.