Pull to refresh

Почему POST превращается в GET

Reading time1 min
Views5.9K
Долго пытался понять, почему следующий код при нажатии на кнопку дает запрос методом GET, хотя явно указан POST.

<html>
<head>
</head>
<body>
<form method="POST" action="http://myhost/mydir">
<input type="submit" value="→" />
</form>
<? echo $_SERVER['REQUEST_METHOD'] ?>
</body>
</html>


* This source code was highlighted with Source Code Highlighter.


Оказывается, Апач при POST-запросе на URL папки без конечного слеша, перенаправляет на URL со слешем и при этом запрос трансформируется в GET. Если же слеш поставить, то эффект пропадает.

Вывод: В action формы ставьте всегда слеш в конце URL папки, а лучше используйте URL файла.

UPD: Как подсказывает Nikita, эта особенность (перенаправление на URL с слешем в конце) управляется в apache 2.2 директивой DirectorySlash, она по умолчанию включена и отключать ее не рекомендуют.

UPD2: Получается такая схема
1. Мы посылаем POST на mysite/mydir
2. Сервер отвечает нам 301 на mysite/mydir/ (почему это правильно, описано в документации к Апачу)
3. Браузер делает GET без параметров на mysite/mydir/ (так и надо делать, это описано в RFC 2616)

В итоге мы вместо нашего POST с параметрами получаем GET без параметров. Все логично, но несколько неожиданно.
Tags:
Hubs:
Total votes 22: ↑19 and ↓3+16
Comments41

Articles