Переменные Url с% 2f, не обрабатываемые 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 должны маршрутизировать любые несуществующие пути к файлу index.php, где определяется силекс, поэтому я не уверен, что происходит.

Мне просто нужен способ захвата значений с помощью «/» для этой конкретной страницы. Нет конфликтующих дочерних страниц, поэтому, если есть способ подстановить путь «/editPage/{.*|filename}/» или что-то очевидное, я пропал без вести.

Это не проблема с Silex, а с Apache.

Apache отклоняет конструкцию закодированных косых черт как часть URI для целей безопасности. См. Этот ответ: https://stackoverflow.com/a/12993237/358813

В качестве обходного пути, передающего значение внутри строки запроса, является полностью прекрасным:

http://example.com/?file=%2Fpath%2Fto%2Ffile будет работать, если вы настроите Silex соответственно.

Вы можете использовать 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) 

В дополнение к @tacone answer, вот как я настроил 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']);