Commit c4595b8b by Qiang Xue

Fixes issue #337: support strict parsing for URL manager.

parent 79598ca8
...@@ -27,6 +27,12 @@ class UrlManager extends Component ...@@ -27,6 +27,12 @@ class UrlManager extends Component
*/ */
public $enablePrettyUrl = false; public $enablePrettyUrl = false;
/** /**
* @var boolean whether to enable strict parsing. If strict parsing is enabled, the incoming
* requested URL must match at least one of the [[rules]] in order to be treated as a valid request.
* This property is used only when [[enablePrettyUrl]] is true.
*/
public $enableStrictParsing = false;
/**
* @var array the rules for creating and parsing URLs when [[enablePrettyUrl]] is true. * @var array the rules for creating and parsing URLs when [[enablePrettyUrl]] is true.
* This property is used only if [[enablePrettyUrl]] is true. Each element in the array * This property is used only if [[enablePrettyUrl]] is true. Each element in the array
* is the configuration array for creating a single URL rule. The configuration will * is the configuration array for creating a single URL rule. The configuration will
...@@ -139,6 +145,10 @@ class UrlManager extends Component ...@@ -139,6 +145,10 @@ class UrlManager extends Component
} }
} }
if ($this->enableStrictParsing) {
return false;
}
$suffix = (string)$this->suffix; $suffix = (string)$this->suffix;
if ($suffix !== '' && $suffix !== '/' && $pathInfo !== '') { if ($suffix !== '' && $suffix !== '/' && $pathInfo !== '') {
$n = strlen($this->suffix); $n = strlen($this->suffix);
......
...@@ -224,5 +224,27 @@ class UrlManagerTest extends \yiiunit\TestCase ...@@ -224,5 +224,27 @@ class UrlManagerTest extends \yiiunit\TestCase
$request->pathInfo = 'site/index'; $request->pathInfo = 'site/index';
$result = $manager->parseRequest($request); $result = $manager->parseRequest($request);
$this->assertFalse($result); $this->assertFalse($result);
// strict parsing
$manager = new UrlManager(array(
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'suffix' => '.html',
'cache' => null,
'rules' => array(
array(
'pattern' => 'post/<id>/<title>',
'route' => 'post/view',
),
),
));
// matching pathinfo
$request->pathInfo = 'post/123/this+is+sample.html';
$result = $manager->parseRequest($request);
$this->assertEquals(array('post/view', array('id' => '123', 'title' => 'this+is+sample')), $result);
// unmatching pathinfo
$request->pathInfo = 'site/index.html';
$result = $manager->parseRequest($request);
$this->assertFalse($result);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment