web-dev-qa-db-ja.com

PHP - httpsをhttpに、wwwをnon-wwwにリダイレクトします。

**編集:私はついにこれを考え出した。自分で答えた自己受け入れられた回答(緑色のチェックマーク)までスクロールしてください。**

現在SSL証明書がないサイトでは、httpsのURLをhttpにリダイレクトするために現在functions.phpを使用しています。

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

ご協力ありがとうございました。しかし、次のコードはhttpshttpに、そして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

non-wwwを使用してHTTPSHTTPに、www.htaccessにリダイレクトする方法:

  1. まずHTTPSが機能していて有効であることを確認してください。 暗号化しましょう 最近では(そして無料で)できます。

    注:HTTPSHTTPにリダイレクトしていますが、その逆、つまりHTTPからHTTPSにすることをお勧めします。セキュリティ、SEO、ブラウザの互換性に優れています - 一般的なブラウザでは、HTTPサイトにとってますます困難になっています。

  2. それから.htaccessmod_rewriteモジュールが動いていることを確認してください。

  3. 次に、Webルートディレクトリの.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ソリューションが良いのですか?

Webサーバーを使ってこのようなリダイレクトを行う方が良いでしょう。あなたの質問から、あなたのWebサーバはApacheのように思われるので、それは.htaccessを使ったほうが良いです。なぜ:

  1. それは速いです。
  2. あなたのfunctions.phpファイルはよりきれいなままであり、そしてそれはもともとそこにあったこと、すなわちテーマの修正を行います。
  3. テーマを変更しても影響はありません。
  4. すべてのリダイレクトについて、WordPressのコードベース全体を2回ロードする必要はありません - リダイレクト前とリダイレクト後に1回ずつです。
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が必要です。そうしないと、「Terror screen」がユーザーに表示されます。

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