我是很新的硅石,但与基于Java的MVC框架的经验。
我的问题似乎是如何接受URL参数某些特殊字符。
我有定义为这样的控制器:
$app->get('/editPage/{fileName}', function ($fileName) use ($app,$action) {
return $app['twig']->render('edit.twig.html',$action->editPage($fileName));
});
这对于像URL的伟大工程:
- /myapp/editPage/file.html
- /myapp/editPage/file-2.html
但如果我通过一个编码“/”或%2F,路线不接走了,我得到一个404 1. /myapp/editPage/folder%2Ffile.html
该mod_rewrites规则应该航线任何不存在的文件路径,其中硅石是指在index.php,所以我不知道发生了什么。
我只是需要一种方法以“/”捕捉值这个特定页面。 有没有冲突的childpages,所以如果有通配符路径“/editPage/{.*|filename}/”什么明显我缺少的一种方式。
您可以使用断言来改变所使用的变量相匹配的正则表达式。 如果你想让它匹配任何传递一个非常宽松的正则表达式。
例如。
$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)
这不是与Silex的,但与Apache的问题。
阿帕奇拒绝通过设计编码斜线作为用于安全目的的URI的一部分。 看到这个答案: https://stackoverflow.com/a/12993237/358813
作为传递查询字符串内的值的解决方法是完全没问题:
http://example.com/?file=%2Fpath%2Fto%2Ffile
将工作,只要你配置相应的Silex。
除了@tacone答案的,这里是我如何配置的Silex,使其工作。 我想这不是然而最漂亮的解决方案......
所谓的URL应该/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']);