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

Posted

技术标签:

【中文标题】通过 wp-config.php 在 wordpress 上正确强制 SSL【英文标题】:Correctly force SSL on wordpress via wp-config.php 【发布时间】:2015-10-31 12:41:13 【问题描述】:

如果我编辑 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 的稍微不同的变体,但我不知道哪个是正确/主要的...

【问题讨论】:

如果您已经通过 Apache 的重定向规则强制使用 SSL,我不确定您要达到什么目的。 @GustavoStraube 似乎在代理后面。如果是这种情况,则应修改问题。 【参考方案1】:

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

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

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

【讨论】:

如果使用多站点?【参考方案2】:

我用过这个。这很好。

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

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

【讨论】:

这段代码应该放在哪里?我将它添加到functions.php,现在wp-admin不起作用,但前端仍然有效。 @NuEverest,试着把它放在wp-config.php【参考方案3】:

更正了 .htaccess 规则 (as detailed on wiki.apache.org):

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

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

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

** 作为一般规则,不鼓励更改_SERVER 变量(如SERVER_PORTHTTPS),除非您有一个不那么常见的设置(即在代理之后 - 这是任何这段代码)。

【讨论】:

您的 .htaccess 规则有一个问题是它不强制使用 www,而我发布的那个强制使用 www 和 https? (这也是一个问题,因为我不是100%确定) @Ryflex mysslcertdomainname.com 就是一个例子。对于我自己的站点,我使用%SERVER_NAME - 这意味着“重定向到在 Apache 中配置的主 server_name”。这实际上取决于您购买的 SSL 证书中的域名。 我只希望它强制 www 跨越每个子域/主域,而 https 只跨越主域,在 www 被强制之后,站点 www.website.com 将变为 https://www.website.comwww.testing.website.com将是http://www.testing.website.com【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于通过 wp-config.php 在 wordpress 上正确强制 SSL的主要内容,如果未能解决你的问题,请参考以下文章

wordpress的配置文件wp-config.php在啥地方

服务器安装WP程序出现问题,似乎没有 wp-config.php 文件,但是点击创建是无法创建的

php Redis代码在wp-config.php中

PHP WP-config.php:localhost和开发以及实时站点在一个文件中。

php WP-config.php文件

php WP-config.php文件