web-dev-qa-db-ja.com

PHPサイトURLプロトコルを取得する - httpとhttpsの関係

私は現在のサイトURLプロトコルを確立するための小さな機能を書きましたが、私はSSLを持っておらず、それがhttpsの下で動作するかどうかをテストする方法を知りません。 これが正しいかどうか教えてもらえますか?

function siteURL()
{
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $domainName = $_SERVER['HTTP_Host'].'/';
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

上記のようにする必要がありますか、それとも私はそれを好きですか?

function siteURL()
{
    $protocol = 'http://';
    $domainName = $_SERVER['HTTP_Host'].'/'
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

SSLでは、アンカータグのURLがhttpを使用している場合でも、サーバーはURLを自動的にhttpsに変換しませんか。プロトコルを確認する必要がありますか?

ありがとうございました!

185
anon445699

自動ではありません。あなたのトップ関数は問題ないようです。

67
profitphp

この種の問題を解決するためのもっと便利な方法がありますが、私はそれが遅いことを知っています!上に示された解決策はかなり面倒です、そして、もし誰かがこれをチェックするべきなら、私がする方法があります:

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://';

あなたが好きではない場合、または無条件でさえ

$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';

$_SERVER["SERVER_PROTOCOL"]をご覧ください。

81
Ivo

これは私のために働く

if (isset($_SERVER['HTTPS']) &&
    ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $protocol = 'https://';
}
else {
  $protocol = 'http://';
}
60
Rid Iculous

お釣り:

function siteURL() {
  $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || 
    $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $domainName = $_SERVER['HTTP_Host'];
  return $protocol.$domainName;
}
24
Anoop K

近道

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
16
softcod.com

私によれば、ポート番号をテストするのは良い習慣ではないので、私の解決策は次のとおりです。

define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));

$_SERVER['HTTPS']が設定されていて、 "1"、 "true"、 "on"、または "yes"の場合、HTTPSconstantはTRUEを返します。そうでなければFALSEを返します。

7
alex

IIS以外のシステムでは、これでサイトの自己URLを定義できます。

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_Host'].'/';

または

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';

あなたが本当に欲しいものによります: HTTP_Host vs. SERVER_NAME

6

プロキシの場合SERVER_PORTは正しい値を与えないかもしれませんので、これは私のために働いたものです -

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"
4
Harshit

プロトコルの詳細を取得するには、このサーバー変数を使用します。

 $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
 echo $scheme; //it gives http:// or https://

このサーバー変数は信頼できません。詳細については、以下を参照してください。 $ _SERVER ['REQUEST_SCHEME']は信頼性がありますか?

4
shashik493

私のシステム上で動いたRid Iculousの答えを使って関数を作りました。

function site_protocol() {
    if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')  return $protocol = 'https://'; else return $protocol = 'http://';
}

それが役に立てば幸い

2
miyuru
$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}


echo $protocal;

私はこれが古い質問であることを知っていますが、私は私のサイトでこれをテストする必要があったので、今日私はこれに出会いました。上記の答えは不必要に複雑です。サイトプロトコルを確立するためにあなたがしなければならないのはtest $_SERVER['HTTPS']だけです

プロトコルがHTTPSを使用している場合、$_SERVER['HTTPS']は 'on'を返します。そうでなければ、変数は空のままになります。例えば、次のとおりです。
// test if HTTPS is being used. If it is, the echo will return '$SSL_test: on'. If not HTTPS, '$SSL_test' will remain empty.

$SSL_test = $_SERVER['HTTPS'];

echo '<p>$SSL_test: '.$SSL_test.'</p>';

if($SSL_test == true) {
    echo 'You\'re using SSL';
} else {
    echo 'You\'re not using SSL';
} 
 </code>

上記を使って、HTTPSを簡単にそしてきれいにテストし、それに応じて実装することができます。 :)

1
Rob Stocki

私は 最も投票された回答 rをテストしましたが、それはうまくいきませんでした

$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
1
Pedro Lobito

CodeIgniterから抽出したもの:

if ( ! function_exists('is_https'))
{
    /**
     * Is HTTPS?
     *
     * Determines if the application is accessed via an encrypted
     * (HTTPS) connection.
     *
     * @return  bool
     */
    function is_https()
    {
        if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        {
            return TRUE;
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        {
            return TRUE;
        }
        elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        {
            return TRUE;
        }

        return FALSE;
    }
}
1
Guillaume

これが私のやり方です...それは速記if elseバージョンのRid Iculousの答えです...

$protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http';
0
Scotty G

これはhttpsまたはhttpの最良の解決策であり、これを使用します。

<?php
$protocol = '//';  
$site_url = $protocol.$_SERVER["HTTP_Host"];
?>

しかし、httpsやhttpを表示することはできませんので、画像などのサイトのコンテンツをリンクするためだけに使用されます。

あなたのサイトをhttpsでリダイレクトしたい場合は、このコードを.htaccessファイルに追加してください。

<IfModule mod_rewrite.c>
 RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
 RewriteRule ^(.*)$ https://www.your-domain.com$1 [L]
</IfModule>

あなたのダウメイン名でwww.your-domain.comを変更してください。

0
Jhoel Rhocher