Как принудительно включить SSL на определенных страницах
Я хочу принудительно использовать защищенное соединение на некоторых страницах (например, с формами), но не хочу, чтобы весь сайт работал через SSL (это замедляет его работу).
Есть ли способ настроить определенные страницы для обязательного использования SSL?

Новый рабочий процесс, так как плагин Admin SSL не поддерживается.
Используйте плагин WP https
Ознакомьтесь с настройками
Если вам нужен SSL для
wp-admin
, добавьте это вwp-config.php
:define( 'FORCE_SSL_ADMIN', TRUE );
Если также нужен SSL для страницы входа, добавьте это в
wp-config.php
:define( 'FORCE_SSL_LOGIN', TRUE );
Добавьте следующую строку в
.htaccess
; удалите стандартные правила WP:<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] </IfModule>
Если вы хотите установить SSL для конкретной страницы/записи во фронтенде, используйте следующий плагин или установите опцию в редакторе записи/страницы; только если у вас активирована эта возможность в плагине WP https. Также смотрите Gist 4081291 для примера плагина:
/** * Plugin Name: Force SSL for specific pages * Description: * Author: Frank Bültge * Author URI: http://bueltge.de/ * Version: 1.0.0 */ ! defined( 'ABSPATH' ) and exit; if ( ! function_exists( 'fb_force_ssl' ) ) { add_filter( 'force_ssl' , 'fb_force_ssl', 1, 3 ); function fb_force_ssl( $force_ssl, $id = 0, $utrl = '' ) { // Список записей/страниц, для которых должен быть SSL $ssl_posts = array( 22, 312 ); if ( in_array( $id, $ssl_posts ) ) $force_ssl = TRUE; return $force_ssl; } } // end if func exists
Без плагина WordPress HTTPS:
add_action( 'template_redirect', 'fb_ssl_template_redirect', 1 ); function fb_ssl_template_redirect() { if ( is_page( 123 ) && ! is_ssl() ) { if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) { wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI']), 301 ); exit(); } else { wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 ); exit(); } } else if ( !is_page( 123 ) && is_ssl() && !is_admin() ) { if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) { wp_redirect(preg_replace('|^https://|', 'http://', $_SERVER['REQUEST_URI']), 301 ); exit(); } else { wp_redirect('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 ); exit(); } } }
Или более короткая версия, но без проверок на ошибочный URL:
add_filter( 'pre_post_link', 'fb_set_ssl_url', 10, 3 );
function fb_set_ssl_url( $permalink, $post, $leavename ) {
if ( 123 == $post->ID )
return preg_replace( '|^http://|', 'https://', $permalink );
return $permalink;
}

Для WordPress версии 3.0 и выше плагин admin-ssl не работает. Чтобы SSL заработал, необходимо выполнить два шага:
- Включите опцию Administration Over SSL в вашем файле wp-config.php (см. здесь).
- Установите плагин WPSSL на сайт. (обновлено для WordPress 3.0+)
- На страницах, которые должны работать через SSL, добавьте мета-тег с именем "force_ssl" и установите значение "true".
После этого все должно работать.

URL плагина Admin SSL: http://wordpress.org/extend/plugins/admin-ssl-secure-admin/

Попробуйте плагин Better WP Security. Помимо множества полезных настроек для защиты вашего сайта, он позволяет принудительно использовать SSL на странице входа в админ-панель, во всей админ-панели (если вы выберете этот вариант), а также на выбранных страницах фронтенда через специальное поле в визуальном редакторе. Очень прост в использовании.
Конечно, для этого сначала необходимо настроить SSL на вашем сервере — это означает, что вам нужно либо установить самоподписанный сертификат (не рекомендуется), либо приобрести сертификат у доверенного центра сертификации и установить его на сервер.

У меня было несколько проблем с вашими решениями (но они мне помогли). Я размещу здесь свои решения для следующего случая:
- WordPress Multisite
- Сервер на vestacp, работающий на apache с nginx proxy
Сначала я использовал только это расширение WP: "SSL Insecure Content Fixer", которое может работать с WPMU и исправлять ошибку "mixed content" (поскольку "Wordpress Https" устарел и не работал для меня).
Во-вторых, функция is_ssl() не работала с nginx proxy, поэтому я использовал эту:
function isSecure() {
return
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
Также функция "is_page()" не работала, поэтому вот мой финальный код (для перенаправления конкретных страниц на https):
add_action( 'template_redirect', 'fb_ssl_template_redirect', 1 );
function fb_ssl_template_redirect() {
global $post;
//login = 8886
//Страницы клиентов
$array_posts_ssl = array(8886);
$array_posts_ssl_parents = array(8886);
if ( in_array($post->ID,$array_posts_ssl) ) {
if ( !isSecure() ) {
wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
exit();
}
} else {
if ( isSecure() ){
wp_redirect('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] , 301 );
exit();
}
}
}

Оба упомянутых выше плагина кажутся устаревшими или, по крайней мере, давно не обновлялись. Плагин WordPress-https представляется наиболее оптимальным вариантом и позволяет принудительно включать SSL для всего сайта или только для определенных страниц.

Этот плагин работает нестабильно в моем случае. Надеюсь найти более подходящий вариант.

Ниже представлен наиболее правильный способ реализации в "WordPress", я полностью прокомментировал код, чтобы объяснить, что он делает.
add_action('wp','_my_custom_ssl_redirect'); // Хук 'wp' - это первое место, где устанавливается ID записи.
function _my_custom_ssl_redirect(){
global $post,$wp; // Получаем глобальные переменные.
$page_ids = array(2,123,321,456); // Массив ID страниц, которые нужно переводить на SSL.
if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){ // Проверяем, что это страница и она в списке для редиректа.
wp_safe_redirect( // Убеждаемся, что редирект только на "внутренние" URL.
add_query_arg( // Добавляем параметры запроса обратно в URL.
$_SERVER['QUERY_STRING'], // Текущие параметры запроса.
'',
trailingslashit( // Добавляем завершающий слэш к URL домашней страницы, так как иногда он отсутствует.
home_url( $wp->request, "https" ), // Получаем HTTPS-ссылку домашней страницы.
301 // Устанавливаем код редиректа 301 "постоянный", можно использовать 302 "временный".
)
)
);
exit; // Немедленно завершаем выполнение, нет смысла загружать что-то еще.
}
}
Версия без комментариев для краткости :) (точно такой же код)
add_action('wp','_my_custom_ssl_redirect');
function _my_custom_ssl_redirect(){
global $post,$wp;
$page_ids = array(2,123,321,456); // Массив ID страниц, которые нужно переводить на SSL.
if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){
wp_safe_redirect( add_query_arg( $_SERVER['QUERY_STRING'], '',trailingslashit(home_url( $wp->request, "https" ), 301 )) );
exit;
}
}
