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


Url Variables with %2f not handled by silex

我对silex很陌生,但对基于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规则应该将任何不存在的文件路径路由到定义silex的index.php,所以我不确定发生了什么。

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

您可以使用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)

这不是Silex的问题,而是Apache的问题。

出于安全目的,Apache拒绝将编码斜杠作为URI的一部分。请参阅以下答案:https://stackoverflow.com/a/12993237/358813

作为一种变通方法,在查询字符串中传递值是完全可以的:

如果您相应地配置Silex,http://example.com/?file=%2Fpath%2Fto%2Ffile将起作用。

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