it-swarm.com.de

PHP - leiten Sie https zu http und www zu non-www um

** EDIT: Ich habe es endlich herausgefunden. Scrollen Sie nach unten, um meine selbst beantwortete, selbst akzeptierte Antwort zu erhalten (grünes Häkchen) **

Ich verwende derzeit functions.php, um https-URLs an http für eine Site umzuleiten, für die derzeit kein SSL-Zertifikat vorhanden ist:

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');

In derselben Funktion möchte ich auch die Unterdomäne www nach non-www umleiten. Ich habe hier eine gute Funktion gefunden, brauche aber Hilfe bei der Implementierung in meine aktuelle Funktion. Ich möchte dies in .htaccess vermeiden, würde aber auch dort eine Lösung begrüßen.

4
Kyle Vassella

Vielen Dank an alle für Ihre Hilfe. Aber der folgende Code funktionierte schließlich für mich, um https zu http und www zu Nicht-www umzuleiten. Ich habe den folgenden Codeblock in functions.php eingefügt:

//check if https being used regardless of certificate
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++) {
    //if 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;
    //if only 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;
    //if only https://
    } elseif ( shapeSpace_check_https() ) {
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: http://' . $_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI']);
            exit;
            break;
    }
}

Ich glaube nicht, dass ich den break; brauche, aber ich brauche definitiv den exit; und ich habe den break; nur für den Fall gelassen. Bitte zögern Sie nicht, mich zu schulen, warum ich möglicherweise nicht beide brauche. Der obige Code führt zu folgenden Weiterleitungen:

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

https://example.com to http://example.com

http://www.example.com to http://example.com

0
Kyle Vassella

So leiten Sie HTTPS zu HTTP und www zu non-www um URL mit .htaccess:

  1. Stellen Sie zunächst sicher, dass HTTPS funktioniert und gültig ist. Es ist heutzutage einfach (und kostenlos), mit Let's Encrypt umzugehen.

    Hinweis:Obwohl Sie HTTPS zu HTTP umleiten, würde ich das Gegenteil empfehlen, d. H. HTTP zu HTTPS. Besser für Sicherheit, SEO und Browserkompatibilität - beliebte Browser erschweren HTTP Websites zunehmend.

  2. Stellen Sie dann sicher, dass das Modul .htaccess und mod_rewrite funktioniert.

  3. Verwenden Sie dann den folgenden CODE in der .htaccess-Datei Ihres Webstammverzeichnisses (wenn Sie dort bereits einige Regeln verwenden, passen Sie sie mit diesen neuen Regeln entsprechend an):

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

    Hinweis:Ersetzen Sie example.com durch Ihren eigenen Domainnamen.


Warum ist die .htaccess Lösung besser:

Es ist besser, diese Art von Weiterleitungen mit dem Webserver durchzuführen. Aus Ihrer Frage, da Ihr Webserver Apache zu sein scheint, ist es besser, mit .htaccess zu tun. Warum:

  1. Es ist schneller.
  2. Ihre functions.php-Datei bleibt sauberer und macht das, wofür sie ursprünglich da war, d. H. Änderungen am Design.
  3. Das Ändern des Themas hat keinen Einfluss darauf.
  4. Bei jeder Weiterleitung muss nicht zweimal die gesamte WordPress-Codebasis geladen werden - einmal vor der Weiterleitung und dann nach der Weiterleitung.
3
Fayaz

Aus Ihrem Code entnommen würde ich es so umgestalten:

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(); 
    }
}

Fügen Sie die .htaccess Regeln für die Weiterleitung hinzu www-> non - www

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

Https-> http umleiten

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

Damit dies funktioniert, benötigen Sie jedoch ein gültiges SSL. Anderenfalls wird den Benutzern der "Terror-Bildschirm" angezeigt.

2
Drupalizeme

Verwenden Sie hier diese aktualisierte Funktion, um eine WWW-Site zu einer Nicht-WWW-Site umzuleiten:

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(); 
    }
}

Lassen Sie mich wissen, ob das hilft.

0
Sid