mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-09-06 09:41:36 +02:00
Merge pull request #3350 from dhensby/pulls/absolute-url-fix
Fixing absolute URLs for empty urls
This commit is contained in:
commit
67ff1cf486
@ -423,12 +423,21 @@ class Director implements TemplateGlobalProvider {
|
|||||||
public static function absoluteURL($url, $relativeToSiteBase = false) {
|
public static function absoluteURL($url, $relativeToSiteBase = false) {
|
||||||
if(!isset($_SERVER['REQUEST_URI'])) return false;
|
if(!isset($_SERVER['REQUEST_URI'])) return false;
|
||||||
|
|
||||||
|
//a url of . or ./ is the same as an empty url
|
||||||
|
if ($url == '.' || $url == './') {
|
||||||
|
$url = '';
|
||||||
|
}
|
||||||
|
|
||||||
if(strpos($url,'/') === false && !$relativeToSiteBase) {
|
if(strpos($url,'/') === false && !$relativeToSiteBase) {
|
||||||
$url = dirname($_SERVER['REQUEST_URI'] . 'x') . '/' . $url;
|
//if there's no URL we want to force a trailing slash on the link
|
||||||
|
if (!$url) {
|
||||||
|
$url = '/';
|
||||||
|
}
|
||||||
|
$url = Controller::join_links(dirname($_SERVER['REQUEST_URI'] . 'x'), $url);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(substr($url,0,4) != "http") {
|
if(substr($url,0,4) != "http") {
|
||||||
if($url[0] != "/") $url = Director::baseURL() . $url;
|
if(strpos($url, '/') !== 0) $url = Director::baseURL() . $url;
|
||||||
// Sometimes baseURL() can return a full URL instead of just a path
|
// Sometimes baseURL() can return a full URL instead of just a path
|
||||||
if(substr($url,0,4) != "http") $url = self::protocolAndHost() . $url;
|
if(substr($url,0,4) != "http") $url = self::protocolAndHost() . $url;
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,16 @@ class DirectorTest extends SapphireTest {
|
|||||||
$_SERVER['REQUEST_URI'] = "$rootURL/mysite/sub-page/";
|
$_SERVER['REQUEST_URI'] = "$rootURL/mysite/sub-page/";
|
||||||
Config::inst()->update('Director', 'alternate_base_url', '/mysite/');
|
Config::inst()->update('Director', 'alternate_base_url', '/mysite/');
|
||||||
|
|
||||||
|
//test empty URL
|
||||||
|
$this->assertEquals("$rootURL/mysite/sub-page/", Director::absoluteURL(''));
|
||||||
|
|
||||||
|
//test absolute - /
|
||||||
|
$this->assertEquals("$rootURL/", Director::absoluteURL('/'));
|
||||||
|
|
||||||
|
//test relative
|
||||||
|
$this->assertEquals("$rootURL/mysite/sub-page/", Director::absoluteURL('./'));
|
||||||
|
$this->assertEquals("$rootURL/mysite/sub-page/", Director::absoluteURL('.'));
|
||||||
|
|
||||||
// Test already absolute url
|
// Test already absolute url
|
||||||
$this->assertEquals($rootURL, Director::absoluteURL($rootURL));
|
$this->assertEquals($rootURL, Director::absoluteURL($rootURL));
|
||||||
$this->assertEquals($rootURL, Director::absoluteURL($rootURL, true));
|
$this->assertEquals($rootURL, Director::absoluteURL($rootURL, true));
|
||||||
@ -137,6 +147,7 @@ class DirectorTest extends SapphireTest {
|
|||||||
Config::inst()->update('Director', 'alternate_base_url', 'http://www.example.org/');
|
Config::inst()->update('Director', 'alternate_base_url', 'http://www.example.org/');
|
||||||
$this->assertEquals('http://www.example.org/', Director::baseURL());
|
$this->assertEquals('http://www.example.org/', Director::baseURL());
|
||||||
$this->assertEquals('http://www.example.org/', Director::absoluteBaseURL());
|
$this->assertEquals('http://www.example.org/', Director::absoluteBaseURL());
|
||||||
|
$this->assertEquals('http://www.example.org/', Director::absoluteURL(''));
|
||||||
$this->assertEquals('http://www.example.org/subfolder/test', Director::absoluteURL('subfolder/test'));
|
$this->assertEquals('http://www.example.org/subfolder/test', Director::absoluteURL('subfolder/test'));
|
||||||
|
|
||||||
// Setting it to false restores functionality
|
// Setting it to false restores functionality
|
||||||
|
@ -161,6 +161,27 @@ class HTTPTest extends FunctionalTest {
|
|||||||
public function testAbsoluteURLsAttributes() {
|
public function testAbsoluteURLsAttributes() {
|
||||||
$this->withBaseURL('http://www.silverstripe.org/', function($test){
|
$this->withBaseURL('http://www.silverstripe.org/', function($test){
|
||||||
|
|
||||||
|
//empty links
|
||||||
|
$test->assertEquals(
|
||||||
|
'<a href="http://www.silverstripe.org/">test</a>',
|
||||||
|
HTTP::absoluteURLs('<a href="">test</a>')
|
||||||
|
);
|
||||||
|
|
||||||
|
$test->assertEquals(
|
||||||
|
'<a href="http://www.silverstripe.org/">test</a>',
|
||||||
|
HTTP::absoluteURLs('<a href="/">test</a>')
|
||||||
|
);
|
||||||
|
|
||||||
|
//relative
|
||||||
|
$test->assertEquals(
|
||||||
|
'<a href="http://www.silverstripe.org/">test</a>',
|
||||||
|
HTTP::absoluteURLs('<a href="./">test</a>')
|
||||||
|
);
|
||||||
|
$test->assertEquals(
|
||||||
|
'<a href="http://www.silverstripe.org/">test</a>',
|
||||||
|
HTTP::absoluteURLs('<a href=".">test</a>')
|
||||||
|
);
|
||||||
|
|
||||||
// links
|
// links
|
||||||
$test->assertEquals(
|
$test->assertEquals(
|
||||||
'<a href=\'http://www.silverstripe.org/blog/\'>SS Blog</a>',
|
'<a href=\'http://www.silverstripe.org/blog/\'>SS Blog</a>',
|
||||||
|
Loading…
Reference in New Issue
Block a user