PHP - rediriger https vers http et www vers non-www

4

** EDIT: J'ai finalement compris cela. Faites défiler l'écran vers le bas pour ma propre réponse auto-acceptée (coche verte) **

J'utilise actuellement functions.php pour rediriger https urls vers http pour un site ne disposant actuellement pas de certificat 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');

Dans cette même fonction, je voudrais également rediriger le sous-domaine www vers un site autre que www. J'ai trouvé une bonne fonction ici , mais j'ai besoin d'aide pour l'implémenter dans ma fonction actuelle. J'aimerais éviter de le faire dans .htaccess , mais souhaiterais y trouver une solution également.

    
posée Kyle Vassella 20.11.2017 - 19:04

4 réponses

0

Merci à tous pour votre aide. Mais le code suivant est ce qui a finalement fonctionné pour moi pour rediriger https vers http et www vers non-www. J'ai placé le bloc de code suivant dans 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;
    }
}

Je ne pense pas avoir besoin des break; , mais j’ai certainement besoin des exit; et j’ai laissé les break; au cas où. S'il vous plaît, n'hésitez pas à comprendre pourquoi je n'ai pas besoin des deux. Le code ci-dessus entraîne les redirections suivantes:

enlace à enlace

enlace à enlace

enlace à enlace

    
réponse donnée Kyle Vassella 27.11.2017 - 18:39
3

Comment rediriger HTTPS vers HTTP et www vers non-www URL avec .htaccess :

  1. Tout d'abord, assurez-vous que HTTPS fonctionne et est valide. C’est facile (et gratuit) à faire avec Encryptons ces jours-ci.

      

    Remarque: Même si vous redirigez HTTPS vers HTTP , je vous recommande de procéder au contraire, c'est-à-dire HTTP vers HTTPS . Mieux pour la sécurité, SEO & Compatibilité des navigateurs - les navigateurs les plus répandus compliquent de plus en plus les sites HTTP .

  2. Assurez-vous ensuite que .htaccess et mod_rewrite module fonctionnent.

  3. Utilisez ensuite le code suivant dans le fichier .htaccess de votre répertoire racine Web (si vous y utilisez déjà des règles, ajustez-les en conséquence avec ces nouvelles règles):

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

    Remarque: remplacez example.com par votre propre nom de domaine.

Pourquoi .htaccess solution vaut-il mieux:

Il est préférable de faire ce type de redirection avec le serveur Web. D'après votre question, comme votre serveur Web semble être Apache , il est préférable de le faire avec .htaccess . Pourquoi:

  1. C'est plus rapide.
  2. Votre fichier functions.php reste plus propre & fait ce pour quoi il est initialement prévu, à savoir les modifications de thème.
  3. Changer le thème n'affectera pas cela.
  4. Pour chaque redirection, l'intégralité du code source de WordPress ne doit pas être chargée deux fois - une fois avant la redirection & puis après redirection.
réponse donnée Fayaz 23.11.2017 - 12:48
2

Tiré de votre code, je le reformulerais comme ceci:

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

Ajoutez-y les règles .htaccess pour la redirection www- > non - www

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

Redirection de https- > http

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

Mais encore une fois pour que cela fonctionne, vous devez disposer d'un SSL valide ou "l'écran de terreur" sera affiché aux utilisateurs.

    
réponse donnée Drupalizeme 20.11.2017 - 20:34
0

Ici, utilisez cette fonction mise à jour pour rediriger un site www vers un site autre que 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(); 
    }
}

Faites-moi savoir si cela vous aide.

    
réponse donnée Sid 23.11.2017 - 13:47

Lire d'autres questions sur les étiquettes