È possibile forzare SSL su determinate pagine
Voglio forzare una connessione sicura su alcune delle mie pagine (quelle con moduli), ma non voglio che l'intero sito funzioni con SSL (rallenterebbe)
È possibile configurare pagine specifiche per richiedere SSL?

Nuovo flusso di lavoro, dato che il plugin Admin SSL non è più supportato.
Utilizza il plugin WP HTTPS
Consulta le impostazioni
Se vuoi SSL per
wp-admin
, aggiungi questo al filewp-config.php
:define( 'FORCE_SSL_ADMIN', TRUE );
Se vuoi SSL anche per la pagina di login, aggiungi questo al file
wp-config.php
define( 'FORCE_SSL_LOGIN', TRUE );
Aggiungi la seguente riga al file
.htaccess
; rimuovi quella predefinita di WP<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] </IfModule>
Se vuoi impostare una pagina/post specifica con SSL in front-end, utilizza il seguente plugin o imposta l'opzione nell'editor del post/pagina; solo se hai attivato questa possibilità nel plugin WP HTTPS. Vedi anche Gist 4081291 per un plugin di esempio
/** * Plugin Name: Forza SSL per pagine specifiche * 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 = '' ) { // Lista di post/pagine che devono essere in SSL $ssl_posts = array( 22, 312 ); if ( in_array( $id, $ssl_posts ) ) $force_ssl = TRUE; return $force_ssl; } } // end if func exists
Senza il 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(); } } }
oppure una versione più compatta, ma senza fallback in caso di URL errati
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;
}

Per WordPress versione 3.0 e superiori, il plugin admin-ssl non funziona. Per far funzionare SSL, è necessario seguire due passaggi:
- Abilita l'opzione Administration Over SSL nel tuo file wp-config.php (vedi qui).
- Installa il plugin WPSSL sul sito. (aggiornato per WordPress 3.0+)
- Sulle pagine che vuoi far funzionare tramite SSL, aggiungi un meta tag chiamato "force_ssl" e imposta il valore su "true".
Dovresti essere a posto dopo questi passaggi.

WPSSL non viene aggiornato da oltre 2 anni. Lo stai attualmente utilizzando con un'installazione aggiornata di WP?

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

Prova il plugin Better WP Security. Oltre a una serie di utili modifiche per proteggere il tuo sito, include alcune impostazioni che ti permettono di forzare l'SSL sulla pagina di login, o sull'intera area amministrativa se lo desideri, e su pagine specifiche del front-end tramite una casella di selezione aggiunta all'editor visivo. Molto semplice da usare.
Ovviamente, devi prima aver configurato l'SSL sul tuo server, il che significa che devi installare un certificato autofirmato (sconsigliato) o acquistare un certificato da un'autorità di certificazione di terze parti e installarlo sul tuo server.

Ho avuto diversi problemi con le vostre soluzioni (ma mi hanno aiutato). Metterò qui le mie soluzioni per il seguente caso:
- Wordpress multisite
- Server su vestacp in esecuzione su apache con proxy nginx
.Inizialmente ho usato solo questa estensione WP: "SSL Insecure Content Fixer" che può gestire WPMU e l'errore "mixed content" (Dato che "Wordpress Https" è deprecato e non funzionava per me)
.In secondo luogo, la funzione is_ssl() non funzionava con il proxy nginx quindi ho usato questa:
function isSecure() {
return
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
.Inoltre "is_page()" non funzionava quindi questo è il mio codice finale (per reindirizzare le pagine specifiche a https)
add_action( 'template_redirect', 'fb_ssl_template_redirect', 1 );
function fb_ssl_template_redirect() {
global $post;
//login = 8886
//Pagine clienti
$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();
}
}
}

Entrambi i plugin menzionati sopra sembrano essere obsoleti o almeno non sono stati mantenuti per un po' di tempo. Il plugin WordPress-https sembra essere l'opzione migliore e forzerà l'SSL su tutto il sito o solo su determinate pagine.

Di seguito è riportato il modo migliore in stile "WordPress" per farlo, ho commentato completamente il codice per spiegarti cosa fa.
add_action('wp','_my_custom_ssl_redirect'); // l'hook 'wp' è il primo punto in cui l'ID del post è impostato.
function _my_custom_ssl_redirect(){
global $post,$wp; // ottieni alcuni valori globali.
$page_ids = array(2,123,321,456); // array di ID di pagine che vogliamo forzare in SSL.
if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){ // verifica che siamo su una pagina e che sia una pagina che vogliamo reindirizzare.
wp_safe_redirect( // assicurati di reindirizzare solo a URL "interni".
add_query_arg( // aggiungi eventuali argomenti di query URL all'URL.
$_SERVER['QUERY_STRING'], // Gli argomenti di query correnti.
'',
trailingslashit( // aggiungi uno slash finale all'URL home poiché a volte non è aggiunto.
home_url( $wp->request, "https" ), // ottieni il link HTTPS dell'URL home.
301 // imposta il reindirizzamento come 301 "permanente", puoi usare 302 "temporaneo" qui invece.
)
)
);
exit; // esci il prima possibile, non ha senso caricare altro.
}
}
Versione non commentata per pulizia :) (stesso identico codice)
add_action('wp','_my_custom_ssl_redirect');
function _my_custom_ssl_redirect(){
global $post,$wp;
$page_ids = array(2,123,321,456); // array di ID di pagine che vogliamo forzare in 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;
}
}
