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ă
HTTPSfuncționează și este valid. Este ușor (și gratuit) să faci asta cu Let's Encrypt în zilele noastre.Notă: Deși redirecționezi
HTTPSlaHTTP, recomand să faci invers, adicăHTTPlaHTTPS. 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_rewritefuncționează.Apoi folosește următorul COD în fișierul
.htaccessdin 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.comcu 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.phpră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.
Kyle Vassella
Î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.
Fayaz
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.
Kyle Vassella
Poate se datorează setărilor sistemului din .htaccess. Aș încerca într-o fereastră privată și aș căuta redirecționări ascunse.
Drupalizeme
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.
Kyle Vassella
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?
Kyle Vassella
@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.
Drupalizeme
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ă.
Kyle Vassella