问题描述

我想在某些页面 (带表单的页面) 上强制安全连接,但是我不希望整个网站使用 ssl(减慢它)

有没有办法配置特定页面来要求 ssl?

最佳解决方案

使用 admin-ssl 插件。对于 wp 之外的东西,在 apache 中使用 rewriite 规则

次佳解决方案

新的工作流程,因为不支持管理 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>
    
  • 如果您在 front-end 中将特定页面/帖子设置为 SSL,则使用以下插件或在 post /page 的编辑器中设置选项; 只有当你有这种插件 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();
                }
            }
    }
    

或者较小的版本,但是如果网址错误,则不能使用回退

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

第三种解决方案

对于 WordPress 3.0 及以上版本,admin-ssl 插件不起作用。为了使 SSL 工作,您需要采取两个步骤:

  1. 启用 wp-config.php 文件 (see here) 中的 「管理层 SSL」 选项。

  2. 在网站上安装 WPSSL 插件。 (更新为 WordPress 3.0+)

  3. 在要通过 SSL 运行的页面上,添加名为”force_ssl” 的元标记,并将其值设置为”true” 。

你应该全部设定好。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。