Eu quero forçar uma conexão segura em algumas das minhas páginas (aquelas com formulários), mas eu não quero que o site inteiro trabalhe com SSL (diminui a velocidade)
Existe uma maneira de configurar páginas específicas para exigir SSL?
Use o plugin admin-ssl. Para coisas fora do wp, use a regra rewriite no Apache
Novo fluxo de trabalho, já que o plugin Admin SSL não é suportado.
use o Plugin WP https
Veja as configurações
Se você quiser SSL para wp-admin
, adicione isto ao wp-config.php
:
define( 'FORCE_SSL_ADMIN', TRUE );
Se você também quiser SSL para a página de login, adicione isto ao wp-config.php
define( 'FORCE_SSL_LOGIN', TRUE );
Adicione a seguinte linha ao .htaccess
; remova o padrão de WP
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
</IfModule>
Se você definir uma página/postagem específica para SSL no front-end, use o seguinte plug-in ou defina a opção no editor da postagem/página; somente se você tiver ativo essa possibilidade do plugin WP https. veja também Gist 4081291 para um exemplo de plugin
/**
* 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
Sem 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();
}
}
}
ou uma versão menor, mas não com fallbacks, se o URL estiver errado
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 o WordPress versão 3.0 e superior, o plugin admin-ssl não funciona. Para que o SSL funcione, você precisa executar duas etapas:
Você deve estar tudo pronto depois disso.
Eu tive vários problemas com suas soluções (mas isso me ajudou). Vou colocar minhas soluções aqui para o seguinte caso:
Primeiro eu só usei essa extensãoWP: "SSL Insecure Content Fixer" que pode manipular o WPMU, e o erro "mixed content" (já que o "Wordpress Https" está obsoleto e não funciona para mim)
.Segundamente, a função is_ssl () não estava funcionando com o proxy nginx, então usei este:
function isSecure() {
return
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
.Also "is_page ()" não estava funcionando, então este é o meu código final (para redirecionar as páginas específicas "para 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();
}
}
}
Tente o Melhor WP Segurança Plugin. Juntamente com vários ajustes úteis para proteger seu site, ele possui algumas configurações que permitem forçar o ssl à página de login ou a todo o back-end, se você escolher, e a páginas selecionadas no front-end por conteúdo por meio de uma seleção caixa adicionada ao editor visual. Muito fácil de usar.
É claro que você precisa configurar o SSL primeiro no servidor, o que significa que você precisa instalar um certificado autoassinado (não recomendado) ou pagar por um certificado de uma autoridade de terceiros e instalá-lo em seu servidor.
Abaixo seria o melhor "WordPress" maneira de fazê-lo, eu totalmente comentou para você explicar o que está fazendo.
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.
}
}
Versão não comentada para limpeza :) (mesmo código exato)
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;
}
}
Ambos os plugins mencionados acima parecem estar desatualizados ou, pelo menos, não foram mantidos durante um tempo. O WordPress-https plugin parece ser a melhor opção e forçará o ssl em todo o site ou apenas em certas páginas.