it-swarm.com.ru

PHP - перенаправить https на http и www на не-www

** Правка: я наконец понял это. Прокрутите вниз, чтобы получить ответ на свой вопрос (зеленый флажок) **

В настоящее время я использую functions.php для перенаправления URL-адресов https на http для сайта, который в настоящее время не имеет 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');

В этой же функции я бы также хотел перенаправить поддомен www на не-www. Я нашел хорошую функцию здесь , но мне нужна помощь, чтобы внедрить ее в мою текущую функцию. Я хотел бы избежать этого в .htaccess, но приветствовал бы и решение там.

4
Kyle Vassella

Спасибо всем за вашу помощь. Но следующий код - это то, что в итоге сработало для меня, чтобы 301 перенаправил https на http и www на не-www. Я поместил следующий блок кода внутри functions.php:

//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;
    }
}

Я не думаю, что мне нужны break;, но мне определенно нужны exit;, и я оставил break; на всякий случай. Пожалуйста, не стесняйтесь учить меня, почему мне не нужны оба. Приведенный выше код приводит к следующим перенаправлениям:

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

Как перенаправить HTTPS на HTTP и www на non-www URL с .htaccess:

  1. Сначала убедитесь, что HTTPS работает и действует. Это легко (и бесплатно) сделать с Let's Encrypt в наши дни.

    Примечание:Несмотря на то, что вы перенаправляете HTTPS на HTTP, я бы рекомендовал сделать это наоборот, т.е. HTTP на HTTPS. Лучше для безопасности, SEO и совместимости с браузерами - популярные браузеры все больше усложняют работу HTTP сайтов.

  2. Затем убедитесь, что модуль .htaccess и mod_rewrite работает.

  3. Затем используйте следующий код в файле .htaccess вашего корневого веб-каталога (если вы уже используете там некоторые правила, измените их в соответствии с этими новыми правилами):

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

    Примечание:Замените example.com своим именем домена.


Почему решение .htaccess лучше:

Такого рода перенаправления лучше делать с веб-сервером. От вашего вопроса, так как ваш веб-сервер, кажется, Apache, лучше делать с .htaccess. Зачем:

  1. Это быстрее.
  2. Ваш functions.php файл остается чистым и делает то, для чего он изначально существует, то есть изменения темы.
  3. Изменение темы не повлияет на это.
  4. Для каждого перенаправления вся кодовая база WordPress не должна загружаться дважды - один раз перед перенаправлением и затем после перенаправления.
3
Fayaz

Взято из вашего кода, я бы рефакторинг это так:

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

Добавьте его в правила .htaccess для перенаправления www-> non - www

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

Перенаправление https-> http

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

Но опять же, чтобы это работало, вам нужно иметь действительный SSL, иначе пользователям будет показан "Экран террора".

2
Drupalizeme

Здесь используйте эту обновленную функцию, чтобы перенаправить сайт www на сайт без 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(); 
    }
}

Позвольте мне знать, если это помогает.

0
Sid