}
}
- return $scheme.'://'.$server['SERVER_NAME'].$port;
+ if (isset($server['HTTP_X_FORWARDED_HOST'])) {
+ // Keep forwarded host
+ if (strpos($server['HTTP_X_FORWARDED_HOST'], ',') !== false) {
+ $hosts = explode(',', $server['HTTP_X_FORWARDED_HOST']);
+ $host = trim($hosts[0]);
+ } else {
+ $host = $server['HTTP_X_FORWARDED_HOST'];
+ }
+ } else {
+ $host = $server['SERVER_NAME'];
+ }
+
+ return $scheme.'://'.$host.$port;
}
// SSL detection
);
}
+ /**
+ * Detect a Proxy that sets Forwarded-Host
+ */
+ public function testHttpsProxyForwardedHost()
+ {
+ $this->assertEquals(
+ 'https://host.tld:8080',
+ server_url(
+ array(
+ 'HTTP_X_FORWARDED_PROTO' => 'https',
+ 'HTTP_X_FORWARDED_PORT' => '8080',
+ 'HTTP_X_FORWARDED_HOST' => 'host.tld'
+ )
+ )
+ );
+
+ $this->assertEquals(
+ 'https://host.tld:4974',
+ server_url(
+ array(
+ 'HTTP_X_FORWARDED_PROTO' => 'https, https',
+ 'HTTP_X_FORWARDED_PORT' => '4974, 80',
+ 'HTTP_X_FORWARDED_HOST' => 'host.tld, example.com'
+ )
+ )
+ );
+ }
+
/**
* Detect a Proxy with SSL enabled
*/