diff --git a/flight/Engine.php b/flight/Engine.php index 879d606..7cac51a 100644 --- a/flight/Engine.php +++ b/flight/Engine.php @@ -386,9 +386,16 @@ class Engine { * @param int $code HTTP status code */ public function _redirect($url, $code = 303) { - $base = $this->request()->base; - if ($base != '/' && strpos($url, '://') === false) { - $url = $base.(($url[0] == '/') ? '' : '/').$url; + if ($this->get('flight.base_url') !== null) { + $base = $this->get('flight.base_url'); + } + else { + $base = $this->request()->base; + } + + // Append base to relative urls + if ($base != '/' && $url[0] != '/' && strpos($url, '://') === false) { + $url = $base.'/'.$url; } $this->response(false) diff --git a/flight/net/Request.php b/flight/net/Request.php index c003513..5fc4316 100644 --- a/flight/net/Request.php +++ b/flight/net/Request.php @@ -43,7 +43,7 @@ class Request { if (empty($config)) { $config = array( 'url' => getenv('REQUEST_URI') ?: '/', - 'base' => str_replace('\\', '/', dirname(getenv('SCRIPT_NAME'))), + 'base' => str_replace(array('\\',' '), array('/','%20'), dirname(getenv('SCRIPT_NAME'))), 'method' => getenv('REQUEST_METHOD') ?: 'GET', 'referrer' => getenv('HTTP_REFERER') ?: '', 'ip' => getenv('REMOTE_ADDR') ?: '', diff --git a/tests/README.md b/tests/README.md index 5357acd..fc7ea76 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,6 +1,6 @@ ## Flight Tests -This directory contains unit tests for Flight. The tests were written for PHPUnit 3.7. +This directory contains unit tests for Flight. The tests were written for PHPUnit 3.7.10 To run the tests do: diff --git a/tests/RedirectTest.php b/tests/RedirectTest.php new file mode 100644 index 0000000..097cbc8 --- /dev/null +++ b/tests/RedirectTest.php @@ -0,0 +1,77 @@ + + * @license MIT, http://flightphp.com/license + */ + +require_once 'PHPUnit/Autoload.php'; +require_once __DIR__.'/../flight/Flight.php'; + +class RedirectTest extends PHPUnit_Framework_TestCase +{ + /** + * @var \flight\Engine + */ + private $app; + + function getBaseUrl($base, $url){ + if ($base != '/' && $url[0] != '/' && strpos($url, '://') === false) { + return $base.'/'.$url; + } + + return $url; + } + + function setUp() { + putenv('SCRIPT_NAME=/subdir/index.php'); + + $this->app = new \flight\Engine(); + $this->app->set('flight.base_url', '/testdir'); + } + + // The base should be the subdirectory + function testBase(){ + $base = $this->app->request()->base; + + $this->assertEquals('/subdir', $base); + } + + // Absolute URLs should ignore the base + function testAbsoluteUrl(){ + $url = '/login'; + $base = $this->app->request()->base; + + $this->assertEquals('/login', $this->getBaseUrl($base, $url)); + } + + // Relative URLs shuold include the base + function testRelativeUrl(){ + $url = 'login'; + $base = $this->app->request()->base; + + $this->assertEquals('/subdir/login', $this->getBaseUrl($base, $url)); + } + + // External URLs should ignore the base + function testHttpUrl(){ + $url = 'http://www.yahoo.com'; + $base = $this->app->request()->base; + + $this->assertEquals('http://www.yahoo.com', $this->getBaseUrl($base, $url)); + } + + // Configuration should override derived value + function testBaseOverride(){ + $url = 'login'; + if ($this->app->get('flight.base_url') !== null) { + $base = $this->app->get('flight.base_url'); + } + else { + $base = $this->app->request()->base; + } + + $this->assertEquals('/testdir/login', $this->getBaseUrl($base, $url)); + } +} diff --git a/tests/RequestTest.php b/tests/RequestTest.php index 807f7ac..54ff9c8 100644 --- a/tests/RequestTest.php +++ b/tests/RequestTest.php @@ -17,6 +17,7 @@ class RequestTest extends PHPUnit_Framework_TestCase function setUp() { putenv('REQUEST_URI=/'); + putenv('SCRIPT_NAME=/index.php'); putenv('REQUEST_METHOD=GET'); putenv('HTTP_X_REQUESTED_WITH=XMLHttpRequest'); putenv('REQUEST_URI=/'); @@ -29,7 +30,7 @@ class RequestTest extends PHPUnit_Framework_TestCase function testDefaults() { $this->assertEquals('/', $this->request->url); - $this->assertEquals('', $this->request->base); + $this->assertEquals('/', $this->request->base); $this->assertEquals('GET', $this->request->method); $this->assertEquals('', $this->request->referrer); $this->assertEquals(true, $this->request->ajax);