通过 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_PORT
和HTTPS
),除非您有一个不那么常见的设置(即在代理之后 - 这是任何这段代码)。
【讨论】:
您的 .htaccess 规则有一个问题是它不强制使用 www,而我发布的那个强制使用 www 和 https? (这也是一个问题,因为我不是100%确定) @Ryflexmysslcertdomainname.com
就是一个例子。对于我自己的站点,我使用%SERVER_NAME
- 这意味着“重定向到在 Apache 中配置的主 server_name”。这实际上取决于您购买的 SSL 证书中的域名。
我只希望它强制 www 跨越每个子域/主域,而 https 只跨越主域,在 www 被强制之后,站点 www.website.com
将变为 https://www.website.com
但 www.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 文件,但是点击创建是无法创建的