web-dev-qa-db-ja.com

特定のページに強制的にSSLをかける方法はありますか

私は自分のページの一部(フォームを含むもの)に安全な接続を強制したいのですが、サイト全体をsslで動作させたくありません(遅くなります)。

Sslを要求するように特定のページを構成する方法はありますか?

6
Sruly

Admin-sslプラグインを使用してください。 wp以外のものについては、Apacheのrewriiteルールを使用してください。

3

管理SSLプラグインはサポートされていないため、新しいワークフロー。

  • プラグインを使用する WP https

  • 設定を見る

  • wp-adminにSSLが必要な場合は、これをwp-config.phpに追加します。

    define( 'FORCE_SSL_ADMIN', TRUE );
    
  • ログインページにもSSLが必要な場合は、これをwp-config.phpに追加します。

    define( 'FORCE_SSL_LOGIN', TRUE );
    
  • 次の行を.htaccessに追加します。 WPのデフォルトを削除

    <IfModule mod_rewrite.c>
       RewriteEngine On
       RewriteCond %{SERVER_PORT} !^443$
       RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
    </IfModule>
    
  • フロントエンドで特定のページ/投稿をSSLに設定した場合は、次のプラグインを使用するか、投稿/ページのエディタでオプションを設定します。あなたがプラグインWP httpsのこの可能性をアクティブにしている場合にのみ。サンプルプラグインについては Gist 4081291 も参照。

    /**
     * Plugin Name: Force SSL for specific pages
     * Description: 
     * Author:      Frank Bültge
     * Author URI:  http://bueltge.de/
     * Version:     1.0.0
     */
    
    ! defined( 'ABSPATH' ) and exit;
    
    if ( ! function_exists( 'fb_force_ssl' ) ) {
    
        add_filter( 'force_ssl' , 'fb_force_ssl', 1, 3 );
        function fb_force_ssl( $force_ssl, $id = 0, $utrl = '' ) {
            // A list of posts/page that should be SSL
            $ssl_posts = array( 22, 312 );
    
            if ( in_array( $id, $ssl_posts ) )
                $force_ssl = TRUE;
    
            return $force_ssl;
        }
    
    } // end if func exists
    
  • プラグインなしWordPress HTTPS

    add_action( 'template_redirect', 'fb_ssl_template_redirect', 1 );
    function fb_ssl_template_redirect() {
    
            if ( is_page( 123 ) && ! is_ssl() ) {
    
                if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
                    wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI']), 301 );
                    exit();
                } else {
                    wp_redirect('https://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'], 301 );
                    exit();
                }
            } else if ( !is_page( 123 ) && is_ssl() && !is_admin() ) {
    
                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();
                }
            }
    }
    

uRLが間違っている場合は、フォールバックは使用しないでください。

add_filter( 'pre_post_link', 'fb_set_ssl_url', 10, 3 );
function fb_set_ssl_url( $permalink, $post, $leavename ) {

    if ( 123 == $post->ID )
        return preg_replace( '|^http://|', 'https://', $permalink );

    return $permalink;
}
11
bueltge

WordPressバージョン3.0以降では、admin-sslプラグインは機能しません。 SSLを機能させるには、2つのステップを踏む必要があります。

  1. Wp-config.phpファイルでAdministration Over SSLオプションを有効にします( ここを参照 )。
  2. サイトに _ wpssl _ プラグインをインストールします。 (WordPress 3.0以降に更新)
  3. SSLを介して実行するページに、「force_ssl」というメタタグを追加して、値を「true」に設定します。

あなたはすべての後に設定する必要があります。

4
Dillie-O

私はあなたの解決策に関して複数の問題を抱えていました(しかしそれは私を助けました)。次のような場合の解決策をここに掲載します。

  • ワードプレスマルチサイト
  • Nginxプロキシを使用してApache上で実行されているvestacp上のサーバー

最初に私はこのWP拡張子だけを使いました:WPMUを扱うことができる "SSL Insecure Content Fixer"、および "mixed content"エラー

同様に、is_ssl()関数はnginxプロキシで動作していなかったので、私はこれを使いました:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

また、 "is_page()"が機能していなかったので、これが私の最後のコードです(特定のページを "https"にリダイレクトするためのコード)。

add_action( 'template_redirect', 'fb_ssl_template_redirect', 1 );
function fb_ssl_template_redirect() {

    global $post;

    //login = 8886
    //Pages clients
    $array_posts_ssl = array(8886);
    $array_posts_ssl_parents = array(8886);

    if ( in_array($post->ID,$array_posts_ssl)  ) {

        if ( !isSecure() ) {
            wp_redirect('https://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'], 301 );
            exit();
        }

    } else  {

        if ( isSecure() ){
            wp_redirect('http://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'] , 301 );
            exit();
        }
    }

}
1

より良いWP Security プラグインを試してください。あなたのサイトを安全にするためのたくさんの役に立つ微調整と共に、それはあなたがログインページ、またはあなたが選択するならバックエンド全体に、そして選択を通してフロントエンドの選択されたページに強制することを可能にするビジュアルエディタにボックスが追加されました。とても使いやすいです。

もちろん、最初にサーバーにSSLを設定する必要があります。つまり、自己署名証明書をインストールするか(推奨されません)、または第三者機関からの証明書を支払い、サーバーにインストールする必要があります。

1
Camajan

以下はそれを行うための最良の "WordPress"の方法でしょう、私はあなたがその動作を説明するためにそれを完全にコメントしています。

add_action('wp','_my_custom_ssl_redirect'); // the 'wp' hook is the first place the post id is set.
function _my_custom_ssl_redirect(){
    global $post,$wp; // get some global values.

    $page_ids = array(2,123,321,456); // array of page ids we want to force to ssl.

    if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){ // check we are on a page and its a page we want to redirect.

        wp_safe_redirect( // make sure we only redirect to "internal" urls.
            add_query_arg( // add any url query arguments back to the url.
                $_SERVER['QUERY_STRING'], // The current query args.
                '',
                trailingslashit( // add a trailing slash to the home url as sometimes it is not added.
                    home_url( $wp->request, "https" ), // get the home url HTTPS link.
                    301 // set the redirect to be 301 "permanent", you can use 302 "temporary" here instead.
                )
            )
        );
        exit; // exit ASAP, no point in loading anything more.
    }
}

きちんとされた:)のための非コメント版(同じ正確なコード)

add_action('wp','_my_custom_ssl_redirect');
function _my_custom_ssl_redirect(){
    global $post,$wp;

    $page_ids = array(2,123,321,456); // array of page ids we want to force to ssl.

    if( is_page() && isset($post->ID) && in_array($post->ID,$page_ids) ){ 
        wp_safe_redirect( add_query_arg( $_SERVER['QUERY_STRING'], '',trailingslashit(home_url( $wp->request, "https" ), 301 )) );
        exit;
    }
}
0

上記の両方のプラグインは古くなっているか、少なくともしばらくの間保守されていないようです。 WordPress-httpsプラグイン が最良の選択肢であると思われ、サイト全体または特定のページでのみSSLを強制します。

0
Drai