Как принудительно включить SSL на определенных страницах

12 авг. 2010 г., 01:30:35
Просмотры: 19K
Голосов: 6

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

Есть ли способ настроить определенные страницы для обязательного использования SSL?

0
Все ответы на вопрос 7
2
11

Новый рабочий процесс, так как плагин 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;
}
16 нояб. 2012 г. 11:29:04
Комментарии

Спасибо; у меня не получилось отформатировать код :(

bueltge bueltge
16 нояб. 2012 г. 12:44:38

Если вы принудительно включаете SSL для админки, вам не нужна строка define( 'FORCE_SSL_LOGIN', TRUE );

Chirag Chirag
23 мая 2013 г. 11:56:55
2

Для WordPress версии 3.0 и выше плагин admin-ssl не работает. Чтобы SSL заработал, необходимо выполнить два шага:

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

После этого все должно работать.

21 окт. 2010 г. 19:11:30
Комментарии

WPSSL не обновлялся более 2 лет. Вы сейчас используете его с обновленной версией WP?

Gaia Gaia
16 нояб. 2012 г. 15:31:51

Я не использую, так как больше не работаю над этим конкретным проектом. Возможно, пришло время найти более новый плагин и порекомендовать его.

Dillie-O Dillie-O
16 нояб. 2012 г. 17:35:20
3

Используйте плагин admin-ssl. Для задач вне WordPress используйте правила перезаписи в Apache

12 авг. 2010 г. 01:42:11
Комментарии

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

artlung artlung
12 авг. 2010 г. 03:40:27

Следует отметить, что этот плагин не работает с WordPress 3.0+

Dillie-O Dillie-O
21 окт. 2010 г. 19:11:14

Даже если он не обновлялся недавно, плагин WordPress HTTPS хорошо работает с новыми версиями WP.

julianm julianm
11 апр. 2016 г. 17:00:22
1

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

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

21 февр. 2013 г. 09:28:28
Комментарии

Это не отвечает на вопрос: "конкретные" страницы.

kaiser kaiser
21 февр. 2013 г. 11:37:17
0

У меня было несколько проблем с вашими решениями (но они мне помогли). Я размещу здесь свои решения для следующего случая:

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

}
8 февр. 2017 г. 17:16:57
2

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

6 сент. 2012 г. 22:47:55
Комментарии

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

cwd cwd
15 сент. 2012 г. 03:12:50

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

Drai Drai
17 сент. 2012 г. 18:48:04
0

Ниже представлен наиболее правильный способ реализации в "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;
    }
}
18 нояб. 2017 г. 17:46:47