From 59f84024e558169b2a79b395779971fce7fa7055 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sun, 14 Oct 2012 11:58:07 -0400 Subject: [PATCH] Handle REQUEST_URI with domain names properly. Don't depend on parse_url() as it fails with corrupted urls. Instead use FULL_BASE_URL to prepare an absolute path. Fixes #3270 --- lib/Cake/Network/CakeRequest.php | 4 +++- .../Test/Case/Network/CakeRequestTest.php | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/Cake/Network/CakeRequest.php b/lib/Cake/Network/CakeRequest.php index 39834b2a2..bee097565 100644 --- a/lib/Cake/Network/CakeRequest.php +++ b/lib/Cake/Network/CakeRequest.php @@ -229,8 +229,10 @@ class CakeRequest implements ArrayAccess { protected function _url() { if (!empty($_SERVER['PATH_INFO'])) { return $_SERVER['PATH_INFO']; - } elseif (isset($_SERVER['REQUEST_URI'])) { + } elseif (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '://') === false) { $uri = $_SERVER['REQUEST_URI']; + } elseif (isset($_SERVER['REQUEST_URI'])) { + $uri = substr($_SERVER['REQUEST_URI'], strlen(FULL_BASE_URL)); } elseif (isset($_SERVER['PHP_SELF']) && isset($_SERVER['SCRIPT_NAME'])) { $uri = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['PHP_SELF']); } elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) { diff --git a/lib/Cake/Test/Case/Network/CakeRequestTest.php b/lib/Cake/Test/Case/Network/CakeRequestTest.php index 564191c54..e5ba8f850 100644 --- a/lib/Cake/Test/Case/Network/CakeRequestTest.php +++ b/lib/Cake/Test/Case/Network/CakeRequestTest.php @@ -1646,6 +1646,30 @@ class CakeRequestTest extends CakeTestCase { 'webroot' => '/', ), ), + array( + 'Apache - w/rewrite, document root set above top level cake dir, request root, absolute REQUEST_URI', + array( + 'App' => array( + 'base' => false, + 'baseUrl' => false, + 'dir' => 'app', + 'webroot' => 'webroot' + ), + 'SERVER' => array( + 'SERVER_NAME' => 'localhost', + 'DOCUMENT_ROOT' => '/Library/WebServer/Documents', + 'SCRIPT_FILENAME' => '/Library/WebServer/Documents/site/index.php', + 'REQUEST_URI' => FULL_BASE_URL . '/site/posts/index', + 'SCRIPT_NAME' => '/site/app/webroot/index.php', + 'PHP_SELF' => '/site/app/webroot/index.php', + ), + ), + array( + 'url' => 'posts/index', + 'base' => '/site', + 'webroot' => '/site/', + ), + ), array( 'Nginx - w/rewrite, document root set to webroot, request root, no PATH_INFO', array(