PHP - reindirizzare da https a http e da www a non-www
**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ì.

Come reindirizzare da HTTPS
a HTTP
e da www
a non-www
con .htaccess
:
Prima assicurati che
HTTPS
funzioni e sia valido. Oggi è facile (e gratuito) farlo con Let's Encrypt.Nota: Anche se stai reindirizzando da
HTTPS
aHTTP
, ti consiglio di fare il contrario, cioè daHTTP
aHTTPS
. È meglio per la sicurezza, la SEO e la compatibilità con i browser - i browser più diffusi stanno rendendo sempre più difficile l'uso di sitiHTTP
.Poi assicurati che
.htaccess
e il modulomod_rewrite
funzionino.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é:
- È più veloce.
- Il tuo file
functions.php
rimane più pulito e fa quello per cui è stato originariamente creato, cioè le modifiche al tema. - Cambiare tema non influirà su questo.
- Per ogni reindirizzamento, non è necessario caricare due volte l'intero codice di WordPress - una volta prima del reindirizzamento e poi dopo.

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.

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.

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

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.

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

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.

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?

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

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

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.

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