Cum să redirecționezi HTTPS la HTTP și www la non-www în PHP
**EDIT: Am reușit să rezolv problema. Derulați în jos pentru răspunsul meu acceptat (bifă verde) **
În prezent folosesc functions.php
pentru a redirecționa URL-urile https
către http
pentru un site care nu are 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');
În aceeași funcție, aș dori să redirecționez și subdomeniul www
către non-www. Am găsit o funcție bună aici, dar am nevoie de ajutor pentru a o implementa în funcția mea actuală. Aș dori să evit să fac asta în .htaccess
, dar aș accepta și o soluție acolo.

Cum să redirecționezi HTTPS
la HTTP
și www
la non-www
URL cu .htaccess
:
Mai întâi asigură-te că
HTTPS
funcționează și este valid. Este ușor (și gratuit) să faci asta cu Let's Encrypt în zilele noastre.Notă: Deși redirecționezi
HTTPS
laHTTP
, recomand să faci invers, adicăHTTP
laHTTPS
. Este mai bine pentru Securitate, SEO & Compatibilitate cu browserele - browserele populare fac din ce în ce mai dificil pentru site-urileHTTP
.Apoi asigură-te că
.htaccess
și modululmod_rewrite
funcționează.Apoi folosește următorul COD în fișierul
.htaccess
din directorul rădăcină al site-ului tău (dacă deja folosești niște reguli acolo, ajustează-le corespunzător cu aceste reguli noi):<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} =on [OR] RewriteCond %{HTTP_HOST} !^example\.com$ RewriteRule ^(.*)$ "http://example.com/$1" [R=301,L] # restul codului htaccess mod_rewrite pentru WordPress </IfModule>
Notă: Înlocuiește
example.com
cu propriul tău nume de domeniu.
De ce soluția .htaccess
este mai bună:
Este mai bine să faci aceste tipuri de redirecționări la nivel de server web. Din întrebarea ta, deoarece serverul tău web pare a fi Apache
, este mai bine să faci asta cu .htaccess
. De ce:
- Este mai rapid.
- Fișierul tău
functions.php
rămâne mai curat & face ceea ce a fost inițial făcut pentru, adică modificări pentru Temă. - Schimbarea temei nu va afecta acest lucru.
- Pentru fiecare redirecționare, întreaga bază de cod WordPress nu trebuie să se încarce de două ori - o dată înainte de redirecționare & apoi după redirecționare.

Mulțumesc pentru asta. Am încercat, dar din nu știu ce motiv modificările în .htaccess
nu au efect (am încercat metoda ta și altele). Mă întreb dacă trebuie să repornesc ceva pentru a le forța să funcționeze.

În primul rând, dacă nu instalezi HTTPS (SSL) corect, atunci regulile din .htaccess
pentru HTTPS s-ar putea să nu funcționeze deloc (am scris asta deja în răspunsul meu). De asemenea, trebuie să te asiguri că .htaccess
chiar funcționează pe site-ul tău, pentru că dacă funcționează, nu ar trebui să fie nevoie de repornire.

Luând din codul tău, l-aș refactoriza astfel:
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();
}
}
Adaugă regulile în .htaccess
pentru redirecționarea www -> non-www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.domeniultau.com [NC]
RewriteRule ^(.*)$ http://domeniultau.com/$1 [L,R=301]
Redirecționare https -> http
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
Dar din nou, pentru ca aceasta să funcționeze, trebuie să ai un SSL valid altfel utilizatorilor li se va afișa ecranul de "Teroare".

Mulțumesc mult că ți-ai luat timp să faci asta. Din păcate, în cazul meu www
nu este eliminat din bara de adrese - cred că nu se face redirecționarea. Am eliminat 'w'-ul în plus din typo-ul 'https://wwww' din codul tău și am încercat și o versiune cu if(strpos($url, $types) !==0)
în loc de ===0
pentru că am crezut că poate asta e problema, dar nu am reușit să o fac să funcționeze. O să continui să mă uit la ea să văd ce pot schimba. Dacă ai vreo idee, te rog să-mi spui.

Poate se datorează setărilor sistemului din .htaccess. Aș încerca într-o fereastră privată și aș căuta redirecționări ascunse.

Mersi că te-ai întors la asta. Am încercat să fac asta în .htaccess
cu metoda ta și cu altele, dar nu reușesc să fac ca modificările să aibă efect - cred că poate trebuie să dezactivez și să reactivez tema mea WordPress ca modificările din .htaccess
să aibă efect, dar nu sunt pregătit să fac acest pas (nu am făcut-o niciodată). Așa că voi rămâne la PHP - încă nu reușesc să o fac să funcționeze. Metoda ta reușește să redirecționeze de la https la http, dar încă nu pot elimina subdomeniul www.
Am verificat într-o fereastră privată și nu am văzut nicio redirecționare ascunsă în fila Network
(dacă așa se verifică) - doar așteptata redirecționare 301 de la https la http.

Am observat că după instrucțiunea ta if else
ai folosit forma prescurtată a lui if
: $redirect_url = !empty($redirect_url)?$redirect_url:$url;
, dar $url
nu este definit global aici - este definit doar în instrucțiunea if
. Nu sunt sigur dacă acesta este motivul sau nu - poate $url
este definit global în PHP, sau nu este necesar oricum?

@KyleVassella 1) Variabila $url nu ar trebui declarată global, deoarece servește doar scopului local pentru instrucțiunea if. Aceasta stochează $_SERVER['REQUEST_URI']
și ar trebui luată în considerare dacă $redirect_url
rămâne goală. 2) Fișierul .htaccess ar trebui să funcționeze așa cum este, fără activarea/dezactivarea temelor. Dar există un mare "dacă" - acest lucru s-ar putea schimba dacă există caching sau altceva care interferează cu regulile. Aș încerca să pun regulile în partea de sus a fișierului .htaccess
.

Mulțumesc tuturor pentru ajutor. Dar următorul cod este ceea ce a funcționat în final pentru mine pentru a face redirect 301 de la https
la http
și de la www
la non-www. Am plasat următorul bloc de cod în interiorul fișierului functions.php
:
//verifică dacă se folosește https indiferent de certificat
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++) {
//dacă 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;
//dacă doar 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;
//dacă doar https://
} elseif ( shapeSpace_check_https() ) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
break;
}
}
Nu cred că am nevoie de break;
-uri, dar cu siguranță am nevoie de exit;
-uri și am lăsat break;
-urile doar pentru orice eventualitate. Vă rog să mă învățați de ce poate nu am nevoie de ambele. Codul de mai sus are ca rezultat următoarele redirectări:
https://www.example.com către http://example.com

Aici, folosește această funcție actualizată pentru a redirecționa un site de la www la 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.') ) { // corectat paranteza lipsă
$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();
}
}
Spune-mi dacă te ajută.

Mulțumesc că ți-ai luat timpul să faci asta. Nu am încercat înainte să obțin propria mea versiune să funcționeze. Aș fi făcut-o, dar în acel moment nu puteam risca să stric din nou site-ul live. Metoda ta ar putea funcționa, deși pe moment nu cred că ar redirecționa http://www.example.com
către http://example.com
deoarece toată logica este în interiorul if (shapeSpace_check_https() )
, care cred că verifică dacă este folosit https
. Aș putea greși însă.
