Назад | Перейти на главную страницу

Почему nginx меняет метод HTTP в правиле перезаписи?

Всякий раз, когда я получаю запрос на mydomain.com, Перенаправляю на www поддомен, используя следующее правило перезаписи:

server_name mydomain.com;
rewrite ^(.*)$ $scheme://www.mydomain.com$1 permanent;

Но если получен запрос POST, он перенаправляется как GET.
Зачем? Как правильно это перенаправить?

Это происходит потому, что веб-браузер изменяет запрос POST на запрос GET.

Согласно RFC 2616, браузер не должен изменять метод запроса при получении 301, а вместо этого предупреждает пользователя и запрашивает подтверждение для повторной отправки запроса на новый URL. К сожалению, я никогда не видел, чтобы веб-браузер действительно делал это. Но причина для выполнения любого из этих действий - защитить пользователя от различных сценариев угона.

См. Раздел 10.3.2.:

Если код состояния 301 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых запрос был отправлен.

Примечание. При автоматическом перенаправлении запроса POST после получения кода состояния 301 некоторые существующие пользовательские агенты HTTP / 1.0 по ошибке изменят его на запрос GET.

Быстрое и простое решение - исправить ваше веб-приложение так, чтобы оно перестало обслуживать URL-адреса, которые необходимо перенаправить. Это также улучшит общую производительность вашего сайта и рейтинг SEO. Например, если вы перенаправляете example.com к www.example.com затем все URL-адресов, обслуживаемых вашим веб-приложением, должны начинаться с www.example.com.