Cum să redirecționezi HTTPS la HTTP și www la non-www în PHP

20 nov. 2017, 18:04:06
Vizualizări: 11.9K
Voturi: 4

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

3
Comentarii

Pentru a redirecționa de la https la http este necesar să ai mai întâi un certificat SSL valid pentru a face handshake-ul inițial și abia apoi să faci redirecționarea.

Drupalizeme Drupalizeme
20 nov. 2017 18:57:42

Cu funcția de mai sus reușesc să redirecționez cu succes de la https la http. Dezavantajul este că utilizatorul tot trebuie să treacă printr-un avertisment înfricoșător din browser care spune că nu există un certificat SSL valid. Momentan sunt de acord cu asta - mă chinui acum cu redirecționarea de la www la non-www folosind preg_replace(). Am nevoie de un operator 'sau' undeva care să spună 'https:// | https://www.'

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

Poți încerca asta: $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
Toate răspunsurile la întrebare 4
2

Cum să redirecționezi HTTPS la HTTP și www la non-www URL cu .htaccess:

  1. 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 la HTTP, recomand să faci invers, adică HTTP la HTTPS. Este mai bine pentru Securitate, SEO & Compatibilitate cu browserele - browserele populare fac din ce în ce mai dificil pentru site-urile HTTP.

  2. Apoi asigură-te că .htaccess și modulul mod_rewrite funcționează.

  3. 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:

  1. Este mai rapid.
  2. 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ă.
  3. Schimbarea temei nu va afecta acest lucru.
  4. 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.
23 nov. 2017 11:48:07
Comentarii

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 Kyle Vassella
27 nov. 2017 15:43:26

Î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 Fayaz
28 nov. 2017 04:29:41
5

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

20 nov. 2017 19:34:00
Comentarii

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 Kyle Vassella
20 nov. 2017 21:21:43

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

Drupalizeme Drupalizeme
21 nov. 2017 06:03:07

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 Kyle Vassella
21 nov. 2017 22:17:46

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 Kyle Vassella
21 nov. 2017 22:24:29

@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 Drupalizeme
22 nov. 2017 07:57:46
1

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

https://example.com către http://example.com

http://www.example.com către http://example.com

27 nov. 2017 17:39:26
Comentarii

Mulțumesc. Funcționează.

Faisal Ramzan Faisal Ramzan
15 aug. 2021 20:22:09
1

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

23 nov. 2017 12:47:34
Comentarii

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 Kyle Vassella
27 nov. 2017 17:51:26