我写了一个小功能来建立当前的网站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() );
Run Code Online (Sandbox Code Playgroud)
是否有必要像上面那样做,或者我可以这样做吗?:
function siteURL()
{
$protocol = 'http://';
$domainName = $_SERVER['HTTP_HOST'].'/'
return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );
Run Code Online (Sandbox Code Playgroud)
在SSL下,即使锚标记网址使用http,服务器也不会自动将网址转换为https?是否有必要检查协议?
谢谢!
Ivo*_*Ivo 87
我知道现在已经很晚了,虽然有一种更方便的方法可以解决这类问题!上面显示的解决方案非常混乱,如果有人应该检查这个,我会怎么做:
$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? 'https://' : 'http://';
Run Code Online (Sandbox Code Playgroud)
如果你不喜欢,甚至没有条件
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';
Run Code Online (Sandbox Code Playgroud)
看一下 $_SERVER["SERVER_PROTOCOL"]
pro*_*php 68
这不是自动的.你的顶级功能看起来不错.
Rid*_*ous 64
这适合我
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://';
}
Run Code Online (Sandbox Code Playgroud)
小智 25
一些变化:
function siteURL() {
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ||
$_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$domainName = $_SERVER['HTTP_HOST'];
return $protocol.$domainName;
}
Run Code Online (Sandbox Code Playgroud)
小智 16
简短的方法
$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
Run Code Online (Sandbox Code Playgroud)
因为根据我的测试端口号不是一个好习惯,我的解决方案是:
define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));
Run Code Online (Sandbox Code Playgroud)
该HTTPS报酬不变TRUE,如果$_SERVER['HTTPS']是"上"或"是"设置和等于"1","真实的".否则返回FALSE.
对于除IIS以外的任何系统,这足以定义站点自身URL:
$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/';
Run Code Online (Sandbox Code Playgroud)
要么
$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';
Run Code Online (Sandbox Code Playgroud)
取决于您的确切需求: HTTP_HOST与SERVER_NAME
从 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;
}
}
Run Code Online (Sandbox Code Playgroud)
使用此服务器变量获取协议详细信息:
$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
echo $scheme; //it gives http:// or https://
Run Code Online (Sandbox Code Playgroud)
请注意,此服务器变量不可靠。有关更多信息,请查看: $_SERVER['REQUEST_SCHEME'] 可靠吗?
如果使用代理,则SERVER_PORT可能无法提供正确的值,因此这对我有用-
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"
Run Code Online (Sandbox Code Playgroud)