PHP: redirige https a http y www a no www

4

** EDITAR: Finalmente me di cuenta de esto. Desplácese hacia abajo para mi respuesta auto-aceptada (marca de verificación verde) **

Actualmente estoy usando functions.php para redirigir https urls a http para un sitio que actualmente no tiene 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');

En esta misma función, también me gustaría redirigir el subdominio www a no www. He encontrado una buena función aquí , pero necesito ayuda para implementarla en mi función actual. Me gustaría evitar hacer esto en .htaccess , pero también agradecería una solución allí.

    
pregunta Kyle Vassella 20.11.2017 - 19:04

4 respuestas

0

Gracias a todos por su ayuda. Pero el siguiente código es lo que finalmente me sirvió para redirigir 301 https a http y www a no www. Coloqué el siguiente bloque 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;
    }
}

No creo que necesite el break; 's, pero definitivamente necesito el exit; ' s y dejé el break; 'por si acaso. Por favor, siéntase libre de enseñarme por qué no necesito ambos. El código anterior produce los siguientes redireccionamientos:

enlace a enlace

enlace a enlace

enlace a enlace

    
respondido por el Kyle Vassella 27.11.2017 - 18:39
3

Cómo redirigir HTTPS a HTTP y www a non-www URL con .htaccess :

  1. Primero asegúrese de que HTTPS esté funcionando y sea válido. Es fácil (y gratuito) de hacer con Vamos a cifrar en estos días.

      

    Nota: Aunque está redirigiendo HTTPS a HTTP , recomendaría hacerlo de manera opuesta, es decir, HTTP a HTTPS . Mejor para la seguridad, SEO y amp; Compatibilidad con el navegador: los navegadores populares dificultan cada vez más los sitios HTTP .

  2. Luego, asegúrate de que los módulos .htaccess y mod_rewrite estén funcionando.

  3. Luego use el siguiente CÓDIGO en el archivo .htaccess de su directorio raíz web (si ya está usando algunas reglas allí, ajústelas de acuerdo con estas nuevas reglas):

    <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>
    
      

    Nota: Reemplaza example.com con tu propio nombre de dominio.

Por qué .htaccess solution es mejor:

Es mejor hacer este tipo de redirecciones con el servidor web. De su pregunta, ya que su servidor web parece ser Apache , es mejor hacerlo con .htaccess . Por qué:

  1. Es más rápido.
  2. Su archivo functions.php permanece limpio & hace lo que está originalmente ahí, es decir, modificaciones de tema.
  3. Cambiar el tema no afectará esto.
  4. Para cada redireccionamiento, la base de código de WordPress completa no tiene que cargarse dos veces, una vez antes de redirigir & luego después de redireccionar.
respondido por el Fayaz 23.11.2017 - 12:48
2

Tomado de tu código, lo refactorizaría así:

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

Agregue las reglas .htaccess para la redirección www- > no - www

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

Redireccionando https- > http

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

Pero, una vez más, para que esto funcione, necesita tener un SSL válido o se mostrará a los usuarios la "pantalla Terror".

    
respondido por el Drupalizeme 20.11.2017 - 20:34
0

Aquí, use esta función actualizada para redirigir un sitio www a no 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(); 
    }
}

Hazme saber si esto ayuda.

    
respondido por el Sid 23.11.2017 - 13:47

Lea otras preguntas en las etiquetas