私は現在のサイト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に変換しませんか。プロトコルを確認する必要がありますか?
ありがとうございました!
自動ではありません。あなたのトップ関数は問題ないようです。
この種の問題を解決するためのもっと便利な方法がありますが、私はそれが遅いことを知っています!上に示された解決策はかなり面倒です、そして、もし誰かがこれをチェックするべきなら、私がする方法があります:
$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://';
あなたが好きではない場合、または無条件でさえ
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';
$_SERVER["SERVER_PROTOCOL"]
をご覧ください。
これは私のために働く
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://';
}
お釣り:
function siteURL() {
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ||
$_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$domainName = $_SERVER['HTTP_Host'];
return $protocol.$domainName;
}
近道
$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
私によれば、ポート番号をテストするのは良い習慣ではないので、私の解決策は次のとおりです。
define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));
$_SERVER['HTTPS']
が設定されていて、 "1"、 "true"、 "on"、または "yes"の場合、HTTPS
constantはTRUE
を返します。そうでなければFALSEを返します。
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
プロキシの場合SERVER_PORT
は正しい値を与えないかもしれませんので、これは私のために働いたものです -
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"
プロトコルの詳細を取得するには、このサーバー変数を使用します。
$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
echo $scheme; //it gives http:// or https://
このサーバー変数は信頼できません。詳細については、以下を参照してください。 $ _SERVER ['REQUEST_SCHEME']は信頼性がありますか?
私のシステム上で動いた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://';
}
それが役に立てば幸い
$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を簡単にそしてきれいにテストし、それに応じて実装することができます。 :)
私は 最も投票された回答 rをテストしましたが、それはうまくいきませんでした。
$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
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;
}
}
これが私のやり方です...それは速記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';
これは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を変更してください。