具有%2f的Url变量不由silex处理

时间:2013-11-29 23:39:50

标签: php symfony routes silex

我是silex的新手,但对基于Java的MVC框架有经验。

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

我有一个如此定义的控制器:

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

这适用于以下网址:

  1. /myapp/editPage/file.html
  2. /myapp/editPage/file-2.html
  3. 但是如果我传递一个编码“/”或%2F,那么路线就不会被拾取,我得到一个404。  1. /myapp/editPage/folder%2Ffile.html

    mod_rewrites规则应该将任何不存在的文件路径路由到定义了silex的index.php,所以我不确定发生了什么。

    我只需要一种方法来捕获这个特定页面的“/”值。没有冲突的子页面,所以如果有一种方法可以通配路径“/editPage/ {。* | filename} /”或明显缺少的东西。

3 个答案:

答案 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']);