Я очень новичок в силексе, но имею опыт работы с Java-инфраструктурой MVC.
Кажется, что проблема заключается в том, как принимать определенные специальные символы в аргументах URL.
У меня есть контроллер, определенный как таковой:
$app->get('/editPage/{fileName}', function ($fileName) use ($app,$action) { return $app['twig']->render('edit.twig.html',$action->editPage($fileName)); });
и это отлично подходит для URL-адресов:
но если я передаю кодировки «/» или% 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']);