mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #1359 from halkyon/forcessl_alternate_base_url
NEW Allow specifying an alternate domain to Director::forceSSL()
This commit is contained in:
commit
2da1de07da
@ -693,15 +693,23 @@ class Director implements TemplateGlobalProvider {
|
|||||||
* if(Director::isLive()) Director::forceSSL(array('/^admin/', '/^Security/'));
|
* if(Director::isLive()) Director::forceSSL(array('/^admin/', '/^Security/'));
|
||||||
* </code>
|
* </code>
|
||||||
*
|
*
|
||||||
|
* If you want certain parts of your site protected under a different domain, you can specify
|
||||||
|
* the domain as an argument:
|
||||||
|
* <code>
|
||||||
|
* if(Director::isLive()) Director::forceSSL(array('/^admin/', '/^Security/'), 'secure.mysite.com');
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
* Note that the session data will be lost when moving from HTTP to HTTPS.
|
* Note that the session data will be lost when moving from HTTP to HTTPS.
|
||||||
* It is your responsibility to ensure that this won't cause usability problems.
|
* It is your responsibility to ensure that this won't cause usability problems.
|
||||||
*
|
*
|
||||||
* CAUTION: This does not respect the site environment mode. You should check this
|
* CAUTION: This does not respect the site environment mode. You should check this
|
||||||
* as per the above examples using Director::isLive() or Director::isTest() for example.
|
* as per the above examples using Director::isLive() or Director::isTest() for example.
|
||||||
*
|
*
|
||||||
|
* @param array $patterns Array of regex patterns to match URLs that should be HTTPS
|
||||||
|
* @param string $secureDomain Secure domain to redirect to. Defaults to the current domain
|
||||||
* @return boolean|string String of URL when unit tests running, boolean FALSE if patterns don't match request URI
|
* @return boolean|string String of URL when unit tests running, boolean FALSE if patterns don't match request URI
|
||||||
*/
|
*/
|
||||||
public static function forceSSL($patterns = null) {
|
public static function forceSSL($patterns = null, $secureDomain = null) {
|
||||||
if(!isset($_SERVER['REQUEST_URI'])) return false;
|
if(!isset($_SERVER['REQUEST_URI'])) return false;
|
||||||
|
|
||||||
$matched = false;
|
$matched = false;
|
||||||
@ -710,8 +718,9 @@ class Director implements TemplateGlobalProvider {
|
|||||||
// Calling from the command-line?
|
// Calling from the command-line?
|
||||||
if(!isset($_SERVER['REQUEST_URI'])) return;
|
if(!isset($_SERVER['REQUEST_URI'])) return;
|
||||||
|
|
||||||
// protect portions of the site based on the pattern
|
|
||||||
$relativeURL = self::makeRelative(Director::absoluteURL($_SERVER['REQUEST_URI']));
|
$relativeURL = self::makeRelative(Director::absoluteURL($_SERVER['REQUEST_URI']));
|
||||||
|
|
||||||
|
// protect portions of the site based on the pattern
|
||||||
foreach($patterns as $pattern) {
|
foreach($patterns as $pattern) {
|
||||||
if(preg_match($pattern, $relativeURL)) {
|
if(preg_match($pattern, $relativeURL)) {
|
||||||
$matched = true;
|
$matched = true;
|
||||||
@ -727,7 +736,14 @@ class Director implements TemplateGlobalProvider {
|
|||||||
&& !(isset($_SERVER['HTTP_X_FORWARDED_PROTOCOL'])
|
&& !(isset($_SERVER['HTTP_X_FORWARDED_PROTOCOL'])
|
||||||
&& strtolower($_SERVER['HTTP_X_FORWARDED_PROTOCOL']) == 'https')) {
|
&& strtolower($_SERVER['HTTP_X_FORWARDED_PROTOCOL']) == 'https')) {
|
||||||
|
|
||||||
$destURL = str_replace('http:', 'https:', Director::absoluteURL($_SERVER['REQUEST_URI']));
|
// if an domain is specified, redirect to that instead of the current domain
|
||||||
|
if($secureDomain) {
|
||||||
|
$url = 'https://' . $secureDomain . $_SERVER['REQUEST_URI'];
|
||||||
|
} else {
|
||||||
|
$url = $_SERVER['REQUEST_URI'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$destURL = str_replace('http:', 'https:', Director::absoluteURL($url));
|
||||||
|
|
||||||
// This coupling to SapphireTest is necessary to test the destination URL and to not interfere with tests
|
// This coupling to SapphireTest is necessary to test the destination URL and to not interfere with tests
|
||||||
if(class_exists('SapphireTest', false) && SapphireTest::is_running_test()) {
|
if(class_exists('SapphireTest', false) && SapphireTest::is_running_test()) {
|
||||||
|
@ -242,6 +242,13 @@ class DirectorTest extends SapphireTest {
|
|||||||
$this->assertFalse($output);
|
$this->assertFalse($output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testForceSSLAlternateDomain() {
|
||||||
|
Director::setBaseURL('/');
|
||||||
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
|
||||||
|
$output = Director::forceSSL(array('/^admin/'), 'secure.mysite.com');
|
||||||
|
$this->assertEquals($output, 'https://secure.mysite.com/admin');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers Director::extract_request_headers()
|
* @covers Director::extract_request_headers()
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user