Url Variables with %2f not handled by silex

妖精的绣舞 提交于 2020-01-24 20:31:48

问题


I am very new to silex, but have experience with Java based MVC frameworks.

The problem I have seems to be how to accept certain special characters in URL arguments.

I have a controller defined as such:

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

and this works great for urls like:

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

but if I pass an encodes "/" or %2F, the route is not picked up, and I get a 404. 1. /myapp/editPage/folder%2Ffile.html

The mod_rewrites rules should route any non-existent file paths to the index.php where silex is defined, so I am not sure what is happening.

I just need a way to capture values with "/" for this particular page. There are no conflicting childpages, so if there is a way to wildcard the path "/editPage/{.*|filename}/" or something obvious I am missing.


回答1:


You can use assert to change the regex that is used to match the variable. If you want it to match anything, pass a very lenient regex.

eg.

$app = new \Silex\Application();

$app->get('/file/{filename}', function ($filename) {
        die(var_dump($filename));
})->assert('filename', '.*');

$app->run();

These requests

GET /file/a%2fb%2fc.txt
GET /file/a/b/c.txt

both yield

string 'a/b/c.txt' (length=9)



回答2:


It's not an issue with Silex but with Apache.

Apache rejects by design encoded slashes as part of the URI for security purposes. See this answer: https://stackoverflow.com/a/12993237/358813

As a workaround passing the value inside a query string is completely fine:

http://example.com/?file=%2Fpath%2Fto%2Ffile will work, provided you configure Silex accordingly.




回答3:


In addition to @tacone answer's, here's how I configured Silex to make it work. I guess it's not the prettiest solution however...

The URL called should be /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']);


来源:https://stackoverflow.com/questions/20294778/url-variables-with-2f-not-handled-by-silex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!