我是silex的新手,但对基于Java的MVC框架有经验。
我遇到的问题似乎是如何接受URL参数中的某些特殊字符。
我有一个如此定义的控制器:
$app->get('/editPage/{fileName}', function ($fileName) use ($app,$action) {
return $app['twig']->render('edit.twig.html',$action->editPage($fileName));
});
这适用于以下网址:
但是如果我传递一个编码“/”或%2F,那么路线就不会被拾取,我得到一个404。 1. /myapp/editPage/folder%2Ffile.html
mod_rewrites规则应该将任何不存在的文件路径路由到定义了silex的index.php,所以我不确定发生了什么。
我只需要一种方法来捕获这个特定页面的“/”值。没有冲突的子页面,所以如果有一种方法可以通配路径“/editPage/ {。* | filename} /”或明显缺少的东西。
答案 0 :(得分:3)
您可以使用assert更改用于匹配变量的正则表达式。如果你想要它匹配任何东西,通过一个非常宽松的正则表达式。
例如
$app = new \Silex\Application();
$app->get('/file/{filename}', function ($filename) {
die(var_dump($filename));
})->assert('filename', '.*');
$app->run();
这些请求
GET /file/a%2fb%2fc.txt
GET /file/a/b/c.txt
都屈服
string 'a/b/c.txt' (length=9)
答案 1 :(得分:3)
这不是Silex的问题,而是Apache的问题。
为了安全起见,Apache将设计编码斜杠拒绝作为URI的一部分。请参阅此答案:https://stackoverflow.com/a/12993237/358813作为一种解决方法,在查询字符串中传递值是完全正确的:
如果您相应地配置Silex, http://example.com/?file=%2Fpath%2Fto%2Ffile
将起作用。
答案 2 :(得分:0)
除了@tacone回答之外,还有我如何配置Silex以使其正常工作。 我想这不是最漂亮的解决方案......
调用的网址应为/get/?url=<url encoded>
$siController->get('/get/', function(Application $app, $url){
/** @var SocialIdentifier $si */
$si = $app['social_identifier.social_identifier'];
$result = $si->get($url);
return $app->json($result, 200);
})
->value('url', $_GET['url']);