PHP - reindirizzare da https a http e da www a non-www

20 nov 2017, 18:04:06
Visualizzazioni: 11.9K
Voti: 4

**MODIFICA: Alla fine ho risolto. Scorri verso il basso per la mia risposta accettata (segno di spunta verde) **

Attualmente sto usando functions.php per reindirizzare gli URL https a http per un sito che attualmente non ha un certificato 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');

Nella stessa funzione, vorrei anche reindirizzare il sottodominio www a non-www. Ho trovato una buona funzione qui, ma ho bisogno di aiuto per implementarla nella mia funzione attuale. Preferirei evitare di farlo in .htaccess, ma accetterei volentieri anche una soluzione lì.

3
Commenti

Per reindirizzare da https a http è necessario prima avere un SSL valido per effettuare l'handshake iniziale e poi eseguire il reindirizzamento.

Drupalizeme Drupalizeme
20 nov 2017 18:57:42

Con la funzione sopra sono in grado di reindirizzare con successo da https a http. Lo svantaggio è che l'utente deve comunque passare attraverso un avviso del browser che dice che non c'è un certificato SSL valido. Per ora mi va bene - sto solo avendo difficoltà con il reindirizzamento da www a non-www via preg_replace(). Ho bisogno di un operatore 'or' da qualche parte che dica 'https:// | https://www.'

Kyle Vassella Kyle Vassella
20 nov 2017 19:10:47

Puoi provare questo $url = $_SERVER['REQUEST_URI']; $redirect_url='' $not_allowed = array('https://wwww', 'https://'); foreach($not_allowed as $types) { if(strpos($url, $types) === 0) { $redirect_url = str_replace($types, 'http://', $url); } }

Drupalizeme Drupalizeme
20 nov 2017 19:20:41
Tutte le risposte alla domanda 4
2

Come reindirizzare da HTTPS a HTTP e da www a non-www con .htaccess:

  1. Prima assicurati che HTTPS funzioni e sia valido. Oggi è facile (e gratuito) farlo con Let's Encrypt.

    Nota: Anche se stai reindirizzando da HTTPS a HTTP, ti consiglio di fare il contrario, cioè da HTTP a HTTPS. È meglio per la sicurezza, la SEO e la compatibilità con i browser - i browser più diffusi stanno rendendo sempre più difficile l'uso di siti HTTP.

  2. Poi assicurati che .htaccess e il modulo mod_rewrite funzionino.

  3. Quindi usa il seguente CODICE nel file .htaccess della directory root del tuo sito web (se stai già usando delle regole, adattale di conseguenza con queste nuove regole):

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

    Nota: Sostituisci example.com con il tuo nome di dominio.


Perché la soluzione con .htaccess è migliore:

È meglio fare questo tipo di reindirizzamenti con il server web. Dalla tua domanda, visto che il tuo server web sembra essere Apache, è meglio farlo con .htaccess. Perché:

  1. È più veloce.
  2. Il tuo file functions.php rimane più pulito e fa quello per cui è stato originariamente creato, cioè le modifiche al tema.
  3. Cambiare tema non influirà su questo.
  4. Per ogni reindirizzamento, non è necessario caricare due volte l'intero codice di WordPress - una volta prima del reindirizzamento e poi dopo.
23 nov 2017 11:48:07
Commenti

Grazie per questo. Ho provato, ma per qualche motivo le modifiche al file .htaccess non hanno effetto (ho provato il tuo metodo e altri). Mi chiedo se devo riavviare qualcosa per forzare il funzionamento.

Kyle Vassella Kyle Vassella
27 nov 2017 15:43:26

Prima di tutto, se non installi HTTPS (SSL) correttamente, allora le regole .htaccess per HTTPS potrebbero non funzionare affatto (l'ho già scritto nella mia risposta). Inoltre, devi assicurarti che .htaccess stia effettivamente funzionando sul tuo sito, perché se è così, il riavvio non dovrebbe essere necessario.

Fayaz Fayaz
28 nov 2017 04:29:41
5

Preso dal tuo codice lo ristrutturerei così:

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

            $non_consentiti = array('https://www', 'https://');
            foreach($non_consentiti as $tipi) {
                if(strpos($url, $tipi) === 0) {
                    $redirect_url = str_replace($tipi, '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(); 
    }
}

Aggiungi le regole .htaccess per il reindirizzamento www-> non - www

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

Reindirizzamento https->http

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

Ma ripeto, perché questo funzioni è necessario avere un SSL valido altrimenti agli utenti verrà mostrata la "schermata del terrore".

20 nov 2017 19:34:00
Commenti

Grazie mille per aver dedicato del tempo a questo. Purtroppo il www non viene rimosso dalla barra degli indirizzi nel mio caso - non credo che stia avvenendo un reindirizzamento. Ho rimosso la 'w' extra dal typo 'https://wwww' nel tuo codice, e ho anche provato una versione con if(strpos($url, $types) !==0) invece del tuo ===0 perché pensavo che potesse essere il problema, ma non sono riuscito a farlo funzionare. Continuerò a guardarlo per vedere cosa posso cambiare. Se hai qualche idea fammi sapere.

Kyle Vassella Kyle Vassella
20 nov 2017 21:21:43

Questo potrebbe essere dovuto alle impostazioni del sistema .htaccess. Proverei in una finestra privata e cercherei reindirizzamenti nascosti.

Drupalizeme Drupalizeme
21 nov 2017 06:03:07

Grazie per essere tornato su questo. Ho provato a farlo in .htaccess con il tuo e altri metodi, ma non riesco a farlo avere effetto - penso che potrei dover disattivare e riattivare il mio tema wordpress per far sì che le modifiche a .htaccess abbiano effetto, ma non sono pronto a fare questo passo (non l'ho mai fatto). Quindi rimarrò con PHP - ancora non riesco a farlo funzionare. Il tuo metodo reindirizza con successo da https a http, ma ancora non riesco a rimuovere il sottodominio www. Ho controllato in una finestra privata e non ho visto reindirizzamenti nascosti nella scheda Network (se è così che si controlla) - solo l'atteso 301 da https -> http.

Kyle Vassella Kyle Vassella
21 nov 2017 22:17:46

Ho notato che dopo la tua dichiarazione if else hai usato la forma abbreviata dell'if: $redirect_url = !empty($redirect_url)?$redirect_url:$url;, ma $url non è definita globalmente qui - è definita solo nell'istruzione if. Non sono sicuro se questo sia un motivo o meno - forse $url è definita globalmente in PHP, o non è necessaria comunque?

Kyle Vassella Kyle Vassella
21 nov 2017 22:24:29

@KyleVassella 1) La variabile $url non dovrebbe essere dichiarata globalmente in quanto serve solo allo scope locale per l'istruzione if. Contiene il valore di $_SERVER['REQUEST_URI'] e dovrebbe essere presa in considerazione se $redirect_url rimane vuota. 2) Il file .htaccess dovrebbe funzionare così com'è senza l'attivazione/disattivazione dei temi. Ma c'è un grosso "se" che potrebbe cambiare se c'è cache o qualcos'altro che interferisce con le regole. Proverei a spostare le regole all'inizio del file .htaccess.

Drupalizeme Drupalizeme
22 nov 2017 07:57:46
1

Grazie a tutti per il vostro aiuto. Ma il seguente codice è ciò che alla fine ha funzionato per me per reindirizzare con un 301 da https a http e da www a non-www. Ho inserito il seguente blocco di codice all'interno di functions.php:

//controlla se viene utilizzato https indipendentemente dal certificato
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++) {
    //se 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;
    //se solo 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;
    //se solo https://
    } elseif ( shapeSpace_check_https() ) {
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
            exit;
            break;
    }
}

Non credo di aver bisogno dei break;, ma sicuramente ho bisogno degli exit; e ho lasciato i break; per sicurezza. Sentitevi liberi di spiegarmi perché potrei non aver bisogno di entrambi. Il codice sopra riportato produce i seguenti reindirizzamenti:

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

https://example.com a http://example.com

http://www.example.com a http://example.com

27 nov 2017 17:39:26
Commenti

Grazie. Funziona.

Faisal Ramzan Faisal Ramzan
15 ago 2021 20:22:09
1

Ecco, usa questa funzione aggiornata per reindirizzare un sito da www a 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(); 
    }
}

Fammi sapere se questo ti aiuta.

23 nov 2017 12:47:34
Commenti

Grazie per aver dedicato del tempo a farlo. Non l'ho provato prima di far funzionare la mia versione. L'avrei fatto, ma in quel momento non potevo rischiare di rompere di nuovo il sito live. Il tuo metodo potrebbe funzionare, anche se a prima vista non credo che reindirizzerebbe http://www.example.com a http://example.com dato che tutta la logica è all'interno di if (shapeSpace_check_https() ) , che credo verifichi se viene utilizzato https. Potrei sbagliarmi però.

Kyle Vassella Kyle Vassella
27 nov 2017 17:51:26