433以外のポートでのhttps使用

  • ページ: BugTrack
  • 投稿者: falcon?
  • 優先順位: 普通
  • 状態: 完了
  • カテゴリー: 本体バグ
  • 投稿日: 2005-11-24 (木) 22:32:24
  • バージョン: 1.4.6
  • リリース予定バージョン: 1.5.2

メッセージ

433以外のポート番号でhttpsを使用した場合強制的にページ内のリンクがhttpになってしまいます。

原因は/lib/func.phpの get_script_uri()で以下のように コーディングされているのが原因だと思います。

$script  = (SERVER_PORT == 443 ? 'https://' : 'http://');
$script  = (SERVER_PORT == 443 ? '/' : '/');
$script .= SERVER_NAME; // host
$script .= (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT);

$scriptへURIを直接書けばよいという意見も考えられますが、LAN内から見られなくなるため、この方法は使いたくありません。(DNSサーバをLAN内に立てれと言わないでください)

最初これら4行をコメントアウトして、ページ内のリンクを相対URIにすればよいと考えましが、BugTrack/341 に相対URIだと絶対指定のURLを吐くプラグインで問題が出ると書いてあるためこの方法も使わない方がよいと思ってます。 ちなみに、BugTrack/341には回避策として

$script='pukiwiki.php'

とすればよいとも書いてありますが(もちろん絶対指定のURLが必要なプラグインは捨てることになる)、is_url()でチェックされエラーとなってしまい、設定ファイルで一時的に回避することも現在はできません。

$scriptは相対URIにして、絶対URIが必要なプラグインが絶対URIを使えるように、絶対URIのための変数をpukiwiki.ini.phpに追加してはどうでしょうか?もちろんこの方法でも絶対URIが必要なプラグインへの障害は発生しますが、WAN or LANのどちらかは最低限プラグインを使用することができます。


  • 根本的な解決にはなりませんが、一つ提案です。ローカルからアクセスしているということは、IPもローカルIPになっていますよね?そこで、IPがローカルかどうかを判断させて、$scriptを振り分けるのはどうでしょう?こんな風に↓ -- 0 2005-11-25 (金) 16:00:48
    if ($_SERVER['REMOTE_ADDR'] がローカル) {
    	$script = 'https://local/pukiwiki/';
    } else {
    	$script = 'https://example.com/pukiwiki/';
    }
    • これは、広告手動挿入のサーバー使用時、ローカルテスト環境では広告を入れたくないので使っていた方法です。 -- 0 2005-11-25 (金) 16:04:14
  • 一度BugTrack2/101でFQDNを使うか、サイト内絶対パス(以下path)を混ぜて使うかという話がありました。この辺は詳しくないので、pathで不具合が出るのかどうかは分かりませんが・・・。 -- 0 2005-11-25 (金) 16:05:21
    • “SERVER_PORT == 443”を使用ポート番号に変更してもだめですか? -- 0 2005-11-25 (金) 16:06:28
    • 二行目の“$script = (SERVER_PORT == 443 ? '/' : '/');”ですが、バージョンは何でしょう?1.4.6では見当たりません。完全に一行目を上書きしてしまうと思いますが。 -- 0 2005-11-25 (金) 16:07:16
  • 関連:BugTrack/341。 -- Ratbeta? 2005-11-25 (金) 19:32:32
  • すみません。二行目の“$script = (SERVER_PORT == 443 ? '/' : '/');”は私がソースを少しいじった時のゴミが残ってました。
    "SERVER_PORT == 443"に書き換える方法はURIのポートも443になってしまうため使えないです。
    pukiwiki.ini.phpでhttpsのポート番号を複数設定できて、get_script_uri()内でそのポート番号ならばhttpsを使うようにするという方法を考えたのですがどうでしょうか?-- falcon? 2005-11-26 (土) 12:18:02
  • ちょっと調べてみました。httpsの場合、$_SERVER["HTTPS"]や$_SERVER["SSL_***"]がセットされるようです*1。全ての環境でセットされるかどうかは分かりませんが、もし、全ての環境でセットされるのであれば、ポートでの振り分けより確実かも知れません。また、変数の有無でまず振り分け、該当しない場合はポートで振り分けるようにしておくと、少なくとも変数がセットされる環境ではhttpsと判断され、セットされていなければ現状と同じポートでの振り分けになるので、害はないような気がします。 -- 0 2005-11-27 (日) 17:37:20
  • $_SERVER["HTTPS"] を試してみました。IEの環境ではセットされてました。ありがとうございます。-- falcon? 2005-11-27 (日) 18:10:47
$script  = (SERVER_PORT == 443 ? 'https://' : 'http://');
$script .= SERVER_NAME; // host
$script .= (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT);

  ↓以下のように変更

if (isset($_SERVER['HTTPS'])) {
        $script = 'https://' . SERVER_NAME;
        $script .= (SERVER_PORT == 443 ? '' : ':' . SERVER_PORT);
} else {
        $script = 'http://' . SERVER_NAME;
        $script .= (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT);
}
  • 関連: BugTrack2/299 -- 2008-12-12 (金) 21:16:02
  • 対応しました commit:6785d8bbd5 -- umorigu 2017-09-04 (月) 03:19:04
    • commit:87416fbe41 と合わせて、ポート番号による判定ではなく、($_SERVER['HTTPS'] が 'on') または ($_SERVER['REQUEST_SCHEME'] が 'https') の場合に https:// をURLに設定するようにしました。この判定が合わない場合は、pukiwiki.ini.php で $script を設定できます -- umorigu 2017-09-04 (月) 21:42:02


*1 phpinfo()の“PHP Variables”の部分で確認できます

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-09-04 (月) 21:45:16
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u8. HTML convert time: 0.154 sec.

OSDN