¿Hay alguna manera de forzar SSL en ciertas páginas?
Quiero forzar una conexión segura en algunas de mis páginas (las que tienen formularios), pero no quiero que todo el sitio funcione con SSL (lo ralentiza)
¿Existe alguna manera de configurar páginas específicas para que requieran SSL?

Nuevo flujo de trabajo, ya que el plugin Admin SSL no es compatible.
Utiliza el plugin WP https
Revisa los ajustes
Si deseas SSL para
wp-admin
, añade esto alwp-config.php
:define( 'FORCE_SSL_ADMIN', TRUE );
Si también quieres SSL para la página de inicio de sesión, añade esto al
wp-config.php
define( 'FORCE_SSL_LOGIN', TRUE );
Añade la siguiente línea al
.htaccess
; elimina la configuración por defecto de WP<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] </IfModule>
Si configuras una página/entrada específica para SSL en el front-end, entonces utiliza el siguiente plugin o establece la opción en el editor de la entrada/página; solo si tienes activa esta posibilidad del plugin WP https. Consulta también Gist 4081291 para un plugin de ejemplo
/** * Plugin Name: Forzar SSL para páginas específicas * 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 = '' ) { // Una lista de entradas/páginas que deben ser SSL $ssl_posts = array( 22, 312 ); if ( in_array( $id, $ssl_posts ) ) $force_ssl = TRUE; return $force_ssl; } } // end if func exists
Sin el Plugin 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(); } } }
o una versión más pequeña, pero sin alternativas si la URL es incorrecta
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;
}

Para la versión 3.0 y superiores de WordPress, el plugin admin-ssl no funciona. Para que SSL funcione, debes seguir dos pasos:
- Habilitar la opción de Administración sobre SSL en tu archivo wp-config.php (ver aquí).
- Instalar el plugin WPSSL en el sitio. (actualizado para WordPress 3.0+)
- En las páginas que deseas que funcionen con SSL, añade una metaetiqueta llamada "force_ssl" y establece su valor en "true".
Después de eso, todo debería estar configurado correctamente.

WPSSL no ha sido actualizado en más de 2 años. ¿Actualmente lo estás usando con una instalación actualizada de WP?

URL del plugin Admin SSL: http://wordpress.org/extend/plugins/admin-ssl-secure-admin/

Prueba el plugin Better WP Security. Además de un montón de ajustes útiles para proteger tu sitio, tiene algunas configuraciones que te permiten forzar SSL en la página de inicio de sesión, o en todo el área de administración si lo prefieres, y en páginas seleccionadas del front-end mediante un cuadro de selección añadido al editor visual. Muy fácil de usar.
Por supuesto, primero debes tener SSL configurado en tu servidor, lo que significa que debes instalar un certificado autofirmado (no recomendado) o comprar un certificado de una autoridad de certificación de terceros e instalarlo en tu servidor.

Tuve múltiples problemas con sus soluciones (pero me ayudaron). Aquí compartiré mis soluciones para el siguiente caso:
- WordPress multisitio
- Servidor en vestacp funcionando con Apache y proxy nginx
.Primero solo usé esta extensión de WP: "SSL Insecure Content Fixer" que puede manejar WPMU, y el error de "contenido mixto" (Ya que "WordPress HTTPS" está obsoleto y no funcionó para mí)
.En segundo lugar, la función is_ssl() no funcionaba con el proxy de nginx así que usé esta:
function isSecure() {
return
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
.Además "is_page()" no funcionaba así que este es mi código final (para redireccionar páginas específicas a https)
add_action( 'template_redirect', 'fb_ssl_template_redirect', 1 );
function fb_ssl_template_redirect() {
global $post;
//login = 8886
//Páginas de clientes
$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();
}
}
}

Ambos plugins mencionados anteriormente parecen estar desactualizados o al menos no han sido mantenidos por un tiempo. El plugin WordPress-https parece ser la mejor opción y forzará SSL en todo el sitio o solo en ciertas páginas.

A continuación se muestra la mejor manera de hacerlo en "WordPress", he comentado todo para explicarte qué está haciendo.
add_action('wp','_my_custom_ssl_redirect'); // el hook 'wp' es el primer lugar donde se establece el ID de la publicación.
function _my_custom_ssl_redirect(){
global $post,$wp; // obtener algunos valores globales.
$page_ids = array(2,123,321,456); // array de IDs de páginas que queremos forzar a SSL.
if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){ // verificar que estamos en una página y que es una página que queremos redirigir.
wp_safe_redirect( // asegurarnos de redirigir solo a URLs "internas".
add_query_arg( // agregar cualquier argumento de consulta de URL de vuelta a la URL.
$_SERVER['QUERY_STRING'], // Los argumentos de consulta actuales.
'',
trailingslashit( // agregar una barra diagonal al final de la URL de inicio, ya que a veces no se agrega.
home_url( $wp->request, "https" ), // obtener el enlace HTTPS de la URL de inicio.
301 // configurar la redirección como 301 "permanente", puedes usar 302 "temporal" aquí en su lugar.
)
)
);
exit; // salir lo antes posible, no tiene sentido cargar más cosas.
}
}
Versión sin comentarios para mayor limpieza :) (exactamente el mismo código)
add_action('wp','_my_custom_ssl_redirect');
function _my_custom_ssl_redirect(){
global $post,$wp;
$page_ids = array(2,123,321,456); // array de IDs de páginas que queremos forzar a 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;
}
}
