В корне проекта (‘/’) у меня есть страница типа панели инструментов, которая направляется в ‘Patterns :: index’. Это прекрасно работает для загрузки страницы с помощью GET, но у меня также есть форма на этой странице, на которой я хочу отправить запрос POST для того же действия.
конфиг / routes.php
Router::connect('/', 'Patterns::index');
Линия создания формы в представлении выглядит так:
<?= $this->form->create($filter, ['url' => ['Patterns::index'], 'method' => 'post']) ?>
Заметкаэто тоже выглядело так, но тоже не сработало:
<?= $this->form->create($filter) ?>
Действие, сгенерированное этой формой, является правильным путем к проекту «../client-name» (корень) с методом POST. Но когда я нажимаю «Отправить», он пытается отправить запрос на этот маршрут и получает 301, а затем перенаправляет на «../client-name/» (обратите внимание на косую черту в конце).
Если я вручную отредактирую действие в браузере в HTML, чтобы получить косую черту в конце, запрос будет выполнен должным образом — он отправит запрос POST в Patterns :: index.
Еще кое-что, на что следует обратить внимание: если я удалю строку в config / route и просто получу доступ к ней, перейдя в «/ Patterns», все будет работать так, как задумано …
Может ли кто-нибудь указать мне правильное направление?
Вероятно, именно ваш веб-сервер, а не Lithium, вызывает перенаправление 301. У вас может быть физическая папка с именем client-name
в корне сети. Ваш веб-сервер автоматически добавит косую черту тогда, когда он намеревается обслуживать индекс в этой папке. Другая возможность состоит в том, что ваш веб-сервер (apache? Или nginx?) Где-то имеет правило перезаписи, которое перенаправляет 301 на любой URL, который не имеет косой черты.
Литий использует PHP_SELF
переменная среды для определения базовой папки в lithium\action\Request::_base()
метод.
URL для действия формы генерируется через lithium\net\http\Router::match()
метод. В коде есть строка, которая удаляет все завершающие слэши: https://github.com/UnionOfRAD/lithium/blob/7251cc28/net/http/Router.php#L434
Таким образом, Lithium определенно смещен в сторону URL, у которых нет косой черты. Это ограничение может служить основанием для регистрации проблемы в репозитории github проекта. Если вы редактируете Router.php
файл в структуре и добавить это после строки, которая обрезает путь, он всегда будет включать косую черту для URL-путей без суффикса (то есть расширение файла):
if (!$suffix && $path !== '/') {
$path .= '/';
}
Я не уверен, есть ли другой способ. IIRC, когда я столкнулся с этой проблемой в проекте, я переместил физическую папку в другое место, чтобы мой веб-сервер не вызывал перенаправление 301.
Других решений пока нет …