SSL化サイトのブログカードが表示されなくなった時の対処方法
最近、WordPressでも他サイトへのリンクをoEmbedを使ってブログカードで表示させるのが流行りですが、表示させる方法の一つにプラグインのCeltispack oEmbed extendを使う方法が有ります。
Celtispackはセルティスラボさんが公開しているWordPressのプラグインパックです。
oEmbedを使った他の方法と同様、投稿記事内に直接URLを書き込むだけで、そのURLがOGPの設定がされていると、自動的にURLを書き込んだ位置にブログカードとして表示してくれます。
(↓こんな感じ。htmlとcssはカスタマイズしてます。)
WordPress4.4以降に備わっている機能を使うよりもサーバの負荷を減らせるなどの点で有利な為、使わせてもらっています。
動作も軽く・安定していたのですが、サイトをSSL化した途端、自サイトのページがブログカードとして表示されなくなってしまいました。
そのレスポンスをvar_dumpしてみると
1 |
"cURL error 51: SSL: certificate subject name '*.xserver.jp' does not match target host name 'hogehoge.com'" |
「SSLサーバ(ここではxserver)のホスト名がリクエストしたURLのホスト名と一致しない。」とエラーになっています。
そこでエラーを無視してアクセスを続行させ、HTTPリクエストのレスポンスを取得出来る様にしてやります。
具体的にはHTTPリクエストでSSL検証をさせない様にhttp.sslVerifyパラメータをfalseにしてやります。(今回使っている celtispackは ver 2.3.1、WordPressはver 4.7.2 )
Celtispack oEmbed extendのコードは
celtispack/modules/oEmbed/oEmbed.php
に書かれています。
130〜131行の
130 131 |
$args = array( 'timeout' => 10, 'httpversion' => '1.1' ); $response = wp_safe_remote_get( $url, $args ); |
の連想配列$argsでHTTPリクエストのパラメータを設定しているので、SSLを検証させない様、ここにhttp.sslVerifyパラメータをfalseにする設定を加えてやります。
130 |
$args = array( 'timeout' => 10, 'httpversion' => '1.1', 'sslverify' => false ); |
これでブログカードが表示される様になります。
因みにwp_safe_remote_get() は
wp-includes/http.php の67〜71行に記述されています。
67 68 69 70 71 |
function wp_safe_remote_get( $url, $args = array() ) { $args['reject_unsafe_urls'] = true; $http = _wp_http_get_object(); return $http->get( $url, $args ); } |
_wp_http_get_object() から返ってきたオブジェクトが
wp_safe_remote_get() に返されています。
_wp_http_get_object() もwp-includes / http.php の22〜29行に記述されています。
22 23 24 25 26 27 28 29 |
function _wp_http_get_object() { static $http = null; if ( is_null( $http ) ) { $http = new WP_Http(); } return $http; } |
_wp_http_get_object()は
celtispack/modules/oEmbed/oEmbed.phpの131行目の
wp_safe_remote_get( $url, $args ) の引数の $url と $args を使ってGETしたWP_Http()オブジェクトが返されます。
$argsのキーと値の詳細は、wp-includes/class-http.php の104〜143行目のコメント欄に書かれています。
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
* @param string $url The request URL. * @param string|array $args { * Optional. Array or string of HTTP request arguments. * * @type string $method Request method. Accepts 'GET', 'POST', 'HEAD', or 'PUT'. * Some transports technically allow others, but should not be * assumed. Default 'GET'. * @type int $timeout How long the connection should stay open in seconds. Default 5. * @type int $redirection Number of allowed redirects. Not supported by all transports * Default 5. * @type string $httpversion Version of the HTTP protocol to use. Accepts '1.0' and '1.1'. * Default '1.0'. * @type string $user-agent User-agent value sent. * Default WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ). * @type bool $reject_unsafe_urls Whether to pass URLs through wp_http_validate_url(). * Default false. * @type bool $blocking Whether the calling code requires the result of the request. * If set to false, the request will be sent to the remote server, * and processing returned to the calling code immediately, the caller * will know if the request succeeded or failed, but will not receive * any response from the remote server. Default true. * @type string|array $headers Array or string of headers to send with the request. * Default empty array. * @type array $cookies List of cookies to send with the request. Default empty array. * @type string|array $body Body to send with the request. Default null. * @type bool $compress Whether to compress the $body when sending the request. * @type bool $decompress Whether to decompress a compressed response. If set to false and * compressed content is returned in the response anyway, it will * need to be separately decompressed. Default true. * @type bool $sslverify Whether to verify SSL for the request. Default true. * @type string sslcertificates Absolute path to an SSL certificate .crt file. * Default ABSPATH . WPINC . '/certificates/ca-bundle.crt'. * @type bool $stream Whether to stream to a file. If set to true and no filename was * given, it will be droped it in the WP temp dir and its name will * be set using the basename of the URL. Default false. * @type string $filename Filename of the file to write to when streaming. $stream must be * set to true. Default null. * @type int $limit_response_size Size in bytes to limit the response to. Default null. * * } |