質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    23033questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    8495questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • SSL

    564questions

    SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

WordPressをSSL化した後、httpとhttpsが混在して困っています

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,477

ty-komame

score 6

 状況と経緯

運営中のWordPressサイト全体をSSL化したところ、テーマ内で使用しているURLを出力する類の関数が種類によって「http://~~」「https://~~」という異なる出力結果になってしまい困っています。

SSL化前の状況とSSLに際して行った手順は以下になります。

【SSL化前の状況】
・WordPress + WelcartによるECサイト
・WordPress本体は /wp/ に設置。公開はドメイン直下。
・オリジナル開発テーマ、SSLを導入する前は問題は無い状態
・WordPress本体バージョンは最新、サーバーのPHPは5.6系、mySQLは5.5。

【SSL化】
・XserverにてIPアドレスベースの独自ドメインを申し込み → サーバー側の対応完了
・WordPress管理画面 > 一般設定 にてWordPressアドレス/サイトアドレスを「https://~」に変更
・Welcart > システム設定にて SSLを使用する/WordPressのアドレス/ブログのアドレス を変更

このようにしてSSL化した結果、サイトの現状は以下のようになっています。

<?php the_permalink(); ?>で出力されるURLが「http://~」(SSL化されていないこと以外は正常)
<?php echo home_url(); ?>で出力されるURLが「http://~」(SSL化されていないこと以外は正常)
・試しに<?php home_url(); ?>にしたところ、多くの場合はSSL化された正しいURLが出力される
・上記の補足として、aタグ内href要素に<?php home_url(); ?>のみが存在する場合は、現在表示中のページURLが出力される(最後に別途説明を追加します)
<?php echo get_stylesheet_directory_uri(); ?>など、他にテーマ内で使用されているURLを出力する関数は全て正常

このような状況のため、正しい表記ではないと思いますが<?php echo home_url(); ?><?php home_url(); ?>に差し替えるか、一部は直接URLを入力して対応しています。
サイトトップや固定ページへのリンクは上記の方法で対応できたのですが、個別投稿へのリンクには<?php the_permalink(); ?>を使うしか方法を知らずに困っています。

 質問

<?php echo home_url(); ?>および<?php the_permalink(); ?>がSSL化されたURLを出力してくれない原因と対処方法をご存知の方がいらっしゃいましたら、お力を貸していただけないでしょうか?

すでに公開中のサイトですので、根本原因の排除よりも、現在起きているエラーへの処置を優先したいと思っています。
そのため、例えばfunctions.phpに記述することでhome_url()the_permalink()が出力する値を強制的にhttpsにしてしまう、などの対処方法がありましたら、是非ご教授ください。
よろしくお願いいたします。

 補足

<?php home_url(); ?>という記述をした時の挙動は以下のようになります。

<a href="<?php home_url(); ?>/blog/"> → https://example.com/blog/
<a href="<?php home_url(); ?>/2016/03/03/post1/"> → https://example.com/2016/03/03/post1/

<a href="<?php home_url(); ?>"> → 現在表示中ページのURL(httpの箇所も現在表示中のURLに依る)

追記:chitokuさんにご指摘頂いた通り、上記の説明は私は勘違いでした。

 補足2

頂いたご回答にて$_SERVERが必要とのことですが、以下のような情報でよろしいでしょうか?
(私自身で所有しているサイトではないのでドメインなどは伏せ字(xxxxx)にしています。)

PHP_SELF    /index.php
argv    -
argc    -
GATEWAY_INTERFACE    CGI/1.1
SERVER_ADDR    xxxxxxx
SERVER_NAME    xxxxxxx
SERVER_SOFTWARE    Apache
SERVER_PROTOCOL    HTTP/1.1
REQUEST_METHOD    GET
REQUEST_TIME    1457028756
REQUEST_TIME_FLOAT    1457028756.7541
QUERY_STRING    
DOCUMENT_ROOT    /home/xxxx/xxxx/public_html
HTTP_ACCEPT    text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
HTTP_ACCEPT_CHARSET    -
HTTP_ACCEPT_ENCODING    gzip, deflate, sdch
HTTP_ACCEPT_LANGUAGE    ja,en-US;q=0.8,en;q=0.6
HTTP_CONNECTION    close
HTTP_HOST    xxxxxxx
HTTP_REFERER    -
HTTP_USER_AGENT    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
HTTPS    on
REMOTE_ADDR    xxxxxxx
REMOTE_HOST    -
REMOTE_PORT    25587
REMOTE_USER    -
REDIRECT_REMOTE_USER    -
SCRIPT_FILENAME    /home/xxxxx/xxxxx/public_html/index.php
SERVER_ADMIN    xxxxxxx
SERVER_PORT    443
SERVER_SIGNATURE    
PATH_TRANSLATED    -
SCRIPT_NAME    /index.php
REQUEST_URI    /hoge/
PHP_AUTH_DIGEST    -
PHP_AUTH_USER    -
PHP_AUTH_PW    -
AUTH_TYPE    -
PATH_INFO    -
ORIG_PATH_INFO    -
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+2

お、ということは home_url に対して何らかのフックが登録されていて、home_url 関数が呼ばれた時に何らかのプラグインがその結果に加工を行っているということです。(フックが登録されていない場合は長い出力ではなく NULL が表示されます)

ここからは原因究明が大変そうですね……。plugins ディレクトリに対して add_filter( 'home_url' している部分を検索してプラグインを特定するしかないかと思います。あるいはテーマの functions.php に似たような記述がないか探してみてください。

あまり有力な手がかりがアドバイスできずすみません…。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/05 03:46

    最初は全く原因不明の状態でしたが、ぼんやりと問題の所在がわかってきました。大変有益なアドバイスをありがとうございます!

    問題のサイトはWordPressのインストールからテーマの制作まで全て私が行いましたので、functions.phpは原因ではないと思っています。また私はフックやフィルタといったレベルまで到達していませんので、高度な処理をしようとして記述ミスをしているわけでもなさそうです。
    home_urlは直接URLを記述すれば解決ですが、the_permalinkの代替が思い浮かばないので、もう少し探ってみます!

    キャンセル

  • 2016/03/05 03:56

    頂いたアドバイスからプラグインが怪しいと感じましたので、「Welcart e-Commerce」を停止したらhome_urlおよびthe_permalinkの出力URLがSSL化されました!
    なんとかここまでたどり着きました。ありがとうございました。
    welcart関連のエラー報告など、ネット上で調べてみます。

    キャンセル

+1

管理画面 Welcart > システム設定 にて、「SSLを使用する」のチェックを外すとthe_permalinkおよびhome_url関数で出力されるURLがSSL化されました。

調べたところ、Welcartではサイト全体をSSL化する際は「SSLを使用する」のチェックを外さないといけないようです。

たくさんのアドバイスを頂き原因を絞り込んでいくことで、このチェックを外すところまで辿りつけました。ご回答頂いた方へ御礼を申し上げます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

home_url 関数は文字列を出力しません
補足のような挙動、ブラウザーでクリックするなどして確認していませんか?
実際の出力を見ると <a href="/blog/"> になっていて、結果的に望ましい挙動だったのではないでしょうか。

プロキシなどで SSL だとサーバーが正しく認識できない状況などではありませんか?($_SERVER を補足してください)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/04 02:59

    >実際の出力を見ると <a href="/blog/"> になっていて、結果的に望ましい挙動だったのではないでしょうか。
    ソースコードで確認したところ、ご指摘の通り`<?php home_url(); ?>`の箇所が空白になっていて結果的にドメイントップからの相対パスになり、大半のリンクが正常に機能していたように見えていただけでした。
    >($_SERVER を補足してください)
    当方HTML/CSSしか理解していないレベルですので、こちらの方法についても是非お教えください!

    キャンセル

0

$_SERVER の値を見る限りは正しく PHP 側で SSL が認識できているようですね…。
WordPress の is_ssl() 関数の結果もあわせて確認してみてください。
ダメならこれと戦うより素直に次のようにスキームを指定して書いたほうが精神衛生上楽かもしれません。

<?php echo home_url(null, 'https'); ?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/04 04:34

    回答ありがとうございます!

    >WordPress の is_ssl() 関数の結果もあわせて確認してみてください。
    httpsで表示中のページ内で以下の文を実行してみました。
    ```
    <?php if(is_ssl()){ echo 'ssl' ; } ?>
    ```
    結果、「ssl」と表示されましたのでSSLだと判断されている様子です。

    ところが、同じページ内で`the_permalink()`および`home_url()`はhttpで出力されてしまいます(サイト内のどのページでも、http / https のどちらでアクセスしていても、http://~~となります)。

    アドバイス頂きました`<?php echo home_url(null, 'https'); ?>`で強制的にhttpsにする手法は実は以前から試していたのですが、これもhttpで出力されてしまいます。
    ただし`<?php echo site_url'); ?>`は正常に動作しており、`<?php echo site_url(null, 'https'); ?>`を使用した場合はhttp時でも`https://~~`が出力されます。しかし前述のとおり今回はサイトURLとWP設置URLが異なっているため`site_url`は使用できません。。。。

    キャンセル

0

それは不思議な挙動ですね……。WordPress のソースコードを確認したところ、スキームを指定しない場合でも is_ssl() が true を返す場合は https になるようです。
参照:WordPress/link-template.php

is_admin() が true の場合(管理画面)ではないとすれば、あとは home_url に対してフックが設定されていてそれが悪さしているように思います。

以下のようなコードでフックが登録されていないか確認してみてください。

<?php
function check_filter($tag) {
    global $wp_filter;
    return $wp_filter[$tag] ?: null;
}
var_dump(check_filter('home_url'));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/05 01:51

    ご回答ありがとうございます!
    そうなんです。今までWordPressで上手くいかない時もネット上で解決策が見つかっていたのですが、この挙動については情報が見つからず困ってしまいました。
    唯一見つけた関連ありそうな情報のURLを載せます。
    http://journal.minet.ws/wordpress-returns-http-instead-of-https-using-bloginfo/

    お教え頂いたコードをテンプレート(404.php)内で使用してみたところ、welcartの設定情報や対応メールテンプレートが全て列挙されたようなとても長い文字列が出力されました。が、私のレベルでは頂いたコードで何をチェックしているのかわかりませんでした。。すみません。

    公開中のサイトのためエラー原因を切り分ける作業が難しいのですが、一度プラグインを全て停止して本格的に原因の調査をしてみたいと思います。

    キャンセル

  • 2016/03/05 03:03

    ご指摘の記事ですがこの方の場合は is_ssl が false を返している環境みたいなので関係ないみたいです。

    キャンセル

  • 2016/03/05 03:40

    そうでしたか。。実はこのエラーに遭遇した初期の頃に見つけたブログで、その時(3ヶ月前)はis_sslが何なのかもわからないレベルでしたので内容は理解できていませんでした。。ありがとうございます!

    キャンセル

同じタグがついた質問を見る

  • PHP

    23033questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    8495questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • SSL

    564questions

    SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。