-->

与%URL变量2F不是由硅石处理(Url Variables with / not handled

2019-10-19 01:36发布

我是很新的硅石,但与基于Java的MVC框架的经验。

我的问题似乎是如何接受URL参数某些特殊字符。

我有定义为这样的控制器:

$app->get('/editPage/{fileName}', function ($fileName) use ($app,$action) {
    return $app['twig']->render('edit.twig.html',$action->editPage($fileName));
});

这对于像URL的伟大工程:

  1. /myapp/editPage/file.html
  2. /myapp/editPage/file-2.html

但如果我通过一个编码“/”或%2F,路线不接走了,我得到一个404 1. /myapp/editPage/folder%2Ffile.html

该mod_rewrites规则应该航线任何不存在的文件路径,其中硅石是指在index.php,所以我不知道发生了什么。

我只是需要一种方法以“/”捕捉值这个特定页面。 有没有冲突的childpages,所以如果有通配符路径“/editPage/{.*|filename}/”什么明显我缺少的一种方式。

Answer 1:

您可以使用断言来改变所使用的变量相匹配的正则表达式。 如果你想让它匹配任何传递一个非常宽松的正则表达式。

例如。

$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)


Answer 2:

这不是与Silex的,但与Apache的问题。

阿帕奇拒绝通过设计编码斜线作为用于安全目的的URI的一部分。 看到这个答案: https://stackoverflow.com/a/12993237/358813

作为传递查询字符串内的值的解决方法是完全没问题:

http://example.com/?file=%2Fpath%2Fto%2Ffile将工作,只要你配置相应的Silex。



Answer 3:

除了@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']);


文章来源: Url Variables with %2f not handled by silex