PHP - redireciona https para http e www para não-www

4

** EDIT: eu finalmente percebi isso. Desloque-se para a minha resposta auto-aceita auto-aceita (marca de verificação verde) **

Atualmente, estou usando functions.php para redirecionar https urls para http de um site que atualmente não possui certificado SSL:

function shapeSpace_check_https() { 
if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443) {

    return true; 
}
    return false;
}


function bhww_ssl_template_redirect() {
if ( shapeSpace_check_https() ) {

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

    }

}

add_action( 'template_redirect', 'bhww_ssl_template_redirect');

Nesta mesma função, eu também gostaria de redirecionar o subdomínio www para não-www. Eu encontrei uma boa função aqui , mas preciso de ajuda para implementá-la na minha função atual. Eu gostaria de evitar fazer isso em .htaccess , mas gostaria de receber uma solução lá também.

    
por Kyle Vassella 20.11.2017 / 19:04

4 respostas

0

Obrigado a todos pela sua ajuda. Mas o código a seguir é o que finalmente funcionou para mim para redirecionar 301 https para http e www para não-www. Coloquei o seguinte bloco de código dentro de functions.php :

//check if https being used regardless of certificate
function shapeSpace_check_https() { 
    if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443) {
        return true; 
    }
    return false;
}


for ($x=0; $x<1; $x++) {
    //if https:// && www.
    if ( shapeSpace_check_https() && substr($_SERVER['HTTP_HOST'], 0, 4) === 'www.'){
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: http://' . substr($_SERVER['HTTP_HOST'], 4).$_SERVER['REQUEST_URI']);
            exit;
            break;
    //if only www.
    } elseif (substr($_SERVER['HTTP_HOST'], 0, 4) === 'www.') {
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: http://' . substr($_SERVER['HTTP_HOST'], 4).$_SERVER['REQUEST_URI']);
            exit;
            break;
    //if only https://
    } elseif ( shapeSpace_check_https() ) {
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
            exit;
            break;
    }
}

Eu não acho que eu preciso do break; , mas eu definitivamente preciso do exit; e eu deixei o break; por precaução. Por favor, sinta-se à vontade para me instruir sobre o porquê de eu não precisar dos dois. O código acima resulta nos seguintes redirecionamentos:

enlace para enlace

enlace para enlace

enlace para enlace

    
por Kyle Vassella 27.11.2017 / 18:39
3

Como redirecionar HTTPS para HTTP e www para non-www URL com .htaccess :

  1. Primeiro, verifique se HTTPS está funcionando e é válido. É fácil (e gratuito) fazer com Vamos criptografar nos dias de hoje.

      

    Observação: Embora você esteja redirecionando HTTPS para HTTP , recomendamos fazer o oposto, ou seja, HTTP a HTTPS . Melhor para segurança, SEO & Compatibilidade do navegador - os navegadores populares estão dificultando cada vez mais os HTTP sites.

  2. Verifique se o módulo .htaccess e mod_rewrite está funcionando.

  3. Em seguida, use o seguinte CÓDIGO no arquivo .htaccess do diretório raiz da Web (se você já estiver usando algumas regras, ajuste-as de acordo com essas novas regras):

    <IfModule mod_rewrite.c>
        RewriteEngine On
    
        RewriteCond %{HTTPS}        =on   [OR]
        RewriteCond %{HTTP_HOST}    !^example\.com$
        RewriteRule ^(.*)$          "http://example.com/$1" [R=301,L]
    
        # remaining htaccess mod_rewrite CODE for WordPress
    </IfModule>
    
      

    Observação: Substitua example.com pelo seu próprio nome de domínio.

Por que .htaccess solution é melhor:

É melhor fazer esse tipo de redirecionamento com o servidor da web. De sua pergunta, já que seu servidor da Web parece ser Apache , é melhor fazer com .htaccess . Porquê:

  1. é mais rápido.
  2. Seu arquivo functions.php permanece mais limpo & faz o que está originalmente lá, ou seja, modificações do tema.
  3. A alteração do tema não afetará isso.
  4. Para cada redirecionamento, a base de código inteira do WordPress não precisa ser carregada duas vezes - uma vez antes do redirecionamento & depois do redirecionamento.
por Fayaz 23.11.2017 / 12:48
2

Retirado do seu código eu refatoraria assim:

function bhww_ssl_template_redirect() {
    $redirect_url='';
    if ( shapeSpace_check_https() ) {
        if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {
            $url = $_SERVER['REQUEST_URI'];

            $not_allowed = array('https://www', 'https://');
            foreach($not_allowed as $types) {
                if(strpos($url, $types) === 0) {
                    $redirect_url = str_replace($types, 'http://', $url); 
                } 
            }
        } else {
            $redirect_url ='http://' . $_SERVER['HTTP_HOST'] .  $_SERVER['REQUEST_URI'];
        }

            $redirect_url = !empty($redirect_url)?$redirect_url:$url;
            wp_redirect($redirect_url, 301 );
            exit(); 
    }
}

Adicione as regras .htaccess para o redirecionamento www- > não - www

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.yourdomain.com [NC]
RewriteRule ^(.*)$ http://yourdomain.com/$1 [L,R=301]

Redirecionando https- > http

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

Mas, para que isso funcione, você precisa ter um SSL válido ou a "tela Terror" será exibida para os usuários.

    
por Drupalizeme 20.11.2017 / 20:34
0

Aqui, use esta função atualizada para redirecionar um site www para não www:

function bhww_ssl_template_redirect() {
    $redirect_url='';
    $url = $_SERVER['REQUEST_URI'];
    if ( shapeSpace_check_https() ) {
        if ( 0 === strpos( $url, 'http' ) ) {
            if(strpos($url, 'https://') === 0) {
                $redirect_url = str_replace('https://', 'http://', $url); 
            } 
        } 
        elseif ( TRUE == strpos( $url, 'www.') {
             $redirect_url = str_replace('www.', '', $url); 
        } 
        else {
            $redirect_url ='http://' . $_SERVER['HTTP_HOST'] .  $_SERVER['REQUEST_URI'];
        }
            $redirect_url = !empty($redirect_url)?$redirect_url:$url;
            wp_redirect($redirect_url, 301 );
            exit(); 
    }
}

Deixe-me saber se isso ajuda.

    
por Sid 23.11.2017 / 13:47