Many of Kohana’s built-in static methods for getting stuff like HTML::style
s unfortunately has a bug when trying to output to a server with HTTPS.
The problem can be traced back to URL::base
, which doesn’t properly spit out the right protocol even if the initial request points to it.
The solution is to replace the URL::base
method in system/classes/kohana/url.php
with the following:
/** * Gets the base URL to the application. * To specify a protocol, provide the protocol as a string or request object. * If a protocol is used, a complete URL will be generated using the * `$_SERVER['HTTP_HOST']` variable. * * // Absolute URL path with no host or protocol * echo URL::base(); * * // Absolute URL path with host, https protocol and index.php if set * echo URL::base('https', TRUE); * * // Absolute URL path with host and protocol from $request * echo URL::base($request); * * @param mixed $protocol Protocol string, [Request], or boolean * @param boolean $index Add index file to URL? * @return string * @uses Kohana::$index_file * @uses Request::protocol() */ public static function base($protocol = NULL, $index = FALSE) { // Start with the configured base URL $base_url = Kohana::$base_url; if ($protocol === TRUE) { // Use the initial request to get the protocol $protocol = Request::$initial; } if ($protocol instanceof Request) { if ( ! $protocol->secure()) { // Use the current protocol list($protocol) = explode('/', strtolower($protocol->protocol())); } else { $protocol = 'https'; } } if ( ! $protocol) { // Use the configured default protocol $protocol = parse_url($base_url, PHP_URL_SCHEME); } if ($index === TRUE AND ! empty(Kohana::$index_file)) { // Add the index file to the URL $base_url .= Kohana::$index_file.'/'; } if (is_string($protocol)) { if ($port = parse_url($base_url, PHP_URL_PORT)) { // Found a port, make it usable for the URL $port = ':'.$port; } if ($domain = parse_url($base_url, PHP_URL_HOST)) { // Remove everything but the path from the URL $base_url = parse_url($base_url, PHP_URL_PATH); } else { // Attempt to use HTTP_HOST and fallback to SERVER_NAME $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; } // Add the protocol and domain to the base URL $base_url = $protocol.'://'.$domain.$port.$base_url; } return $base_url; }
The updated URL::base
is from Kohana 3.2’s git. The updated url.php
file is here.