簡體   English   中英

通過 wp-config.php 在 wordpress 上正確強制 SSL

[英]Correctly force SSL on wordpress via wp-config.php

如果我編輯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 規則(詳見 wiki.apache.org ):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM