Есть ли способ принудительно использовать ssl на определенных страницах
Я хочу принудительно установить безопасное соединение на некоторых моих страницах (с формами), но я не хочу, чтобы весь сайт работал с ssl (замедляет его)
Есть ли способ настроить определенные страницы так, чтобы они требовали ssl?
7 answers
Используйте плагин admin-ssl. Для материалов за пределами wp используйте правило перезаписи в apache
Новый рабочий процесс, так как плагин 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 = '' ) { // A list of posts/page that should be 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 работать, вам нужно выполнить два шага:
- Включите опцию Администрирования через SSL в вашем wp-config.php файл ( смотрите здесь).
- Установите плагин WPSSL на сайте. (обновлено для WordPress 3.0+)
- На страницах, которые вы хотите запустить по протоколу SSL, добавьте мета-тег "force_ssl" и установите значение "true".
Вы должны быть полностью готовы после тот.
Попробуйте Плагин лучшей безопасности WP. Наряду с кучей полезных настроек для защиты вашего сайта, в нем есть некоторые настройки, которые позволяют вам принудительно использовать ssl на странице входа или на всей серверной части, если вы выберете, и на выбранных страницах на передней панели для каждого контента с помощью поля выбора, добавленного в визуальный редактор. Очень проста в использовании.
Конечно, сначала вам необходимо настроить SSL на своем сервере, что означает, что вам либо нужно установить самозаверяющий сертификат (не рекомендуется), либо оплатите сертификат от стороннего центра и установите его на свой сервер.
У меня было несколько проблем с вашими решениями (но это помогло мне). Я приведу здесь свои решения для следующего случая:
- Мультисайт Wordpress
- Сервер на vestacp, работающий на apache с прокси-сервером nginx
. Сначала я использовал только это расширение WP: "Средство исправления небезопасного содержимого SSL", которое может обрабатывать WPMU, и ошибку "смешанный контент" (поскольку "Https Wordpress" устарел и не работает для меня)
. Во-вторых, функция is_ssl() не работала с nginx прокси-сервер, поэтому я использовал этот:
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
//Pages clients
$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'); // the 'wp' hook is the first place the post id is set.
function _my_custom_ssl_redirect(){
global $post,$wp; // get some global values.
$page_ids = array(2,123,321,456); // array of page ids we want to force to ssl.
if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){ // check we are on a page and its a page we want to redirect.
wp_safe_redirect( // make sure we only redirect to "internal" urls.
add_query_arg( // add any url query arguments back to the url.
$_SERVER['QUERY_STRING'], // The current query args.
'',
trailingslashit( // add a trailing slash to the home url as sometimes it is not added.
home_url( $wp->request, "https" ), // get the home url HTTPS link.
301 // set the redirect to be 301 "permanent", you can use 302 "temporary" here instead.
)
)
);
exit; // exit ASAP, no point in loading anything more.
}
}
Версия без комментариев для аккуратности:) (тот же точный код)
add_action('wp','_my_custom_ssl_redirect');
function _my_custom_ssl_redirect(){
global $post,$wp;
$page_ids = array(2,123,321,456); // array of page ids we want to force to 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;
}
}