【问题标题】:Url Variables with %2f not handled by silex带有 %2f 的 Url 变量未由 silex 处理
【发布时间】:2013-12-16 04:22:56
【问题描述】:

我对 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

但如果我通过编码“/”或 %2F,则不会选择路线,并且会得到 404。 1. /myapp/editPage/folder%2Ffile.html

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

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

【问题讨论】:

  • 找到了相关的 Q,但该用户想要多个未知数量的不同参数,并且解决方案都朝着这个目标工作。我只有一个参数,我只需要调整默认匹配规则,这些规则似乎在“/”上很难匹配到分解参数。
  • 第二个答案似乎建议您可以使用 assert silex.sensiolabs.org/doc/usage.html#requirements 来允许您想要的。
  • 不,它没有。这些都允许变量的某种格式,但不允许在其中包含编码的“/”。 (如果路由从未被确认,则不能使用断言)

标签: php symfony routes silex


【解决方案1】:

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

【讨论】:

  • 也许我还有另一个问题,因为这条路线仍然被忽略,返回 404。
  • 如果 Apache 有 AllowEncodedSlashes On ( ;( ),这将不起作用
【解决方案2】:

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

出于安全考虑,Apache 在设计上拒绝将编码斜杠作为 URI 的一部分。看到这个答案:https://stackoverflow.com/a/12993237/358813

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多