web-dev-qa-db-fra.com

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

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

J'utilise actuellement functions.php pour rediriger les URL https 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, j'aimerais é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 faire cela dans .htaccess, mais souhaiterais également une solution.

4
Kyle Vassella

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 du break;, mais j'ai certainement besoin du exit; et j'ai laissé le 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:

https://www.example.com to http://example.com

https://example.com to http://example.com

http://www.example.com to http://example.com

0
Kyle Vassella

Comment rediriger HTTPSvers HTTPet wwwvers non-www URL avec .htaccess:

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

    Remarque: Bien que vous redirigiez HTTPSvers HTTPname__, je vous conseillerais de l'inverser, c'est-à-dire HTTPvers HTTPSname__. Mieux pour la sécurité, le référencement et la compatibilité des navigateurs - les navigateurs les plus répandus rendent de plus en plus difficile les sites HTTPname__.

  2. Ensuite, assurez-vous que les modules .htaccess et mod_rewrite fonctionnent.

  3. Puis utilisez 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>
    

    Note: Remplacez example.com par votre propre nom de domaine.


Pourquoi la solution .htaccess est-elle meilleure?

Il est préférable de faire ce type de redirections avec le serveur Web. D'après votre question, étant donné que votre serveur Web semble être Apachename__, il est préférable de procéder avec .htaccess. Pourquoi:

  1. C'est plus rapide.
  2. Votre fichier functions.php reste plus propre et fait son travail d’origine, c’est-à-dire 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, puis après.
3
Fayaz

Tiré de votre code, je voudrais le reformuler 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 https-> http

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

Mais encore une fois pour que cela fonctionne, vous devez avoir un SSL valide ou "l'écran Terror" sera montré aux utilisateurs.

2
Drupalizeme

Ici, utilisez cette fonction mise à jour pour rediriger un site www vers un site non-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 aide.

0
Sid