Браузер дает мне http статус кода 200, тогда как curl дает мне код состояния 301 - PullRequest
1 голос
/ 01 мая 2019

Когда я заполняю форму на сайте и проверяю ее с помощью Chrome Dev Tools, я получаю следующую информацию:

Response Headers:
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Status: 200 OK

Request Headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 53
Content-Type: application/x-www-form-urlencoded
DNT: 1
Host: www.32x8.com
Origin: http://www.32x8.com

Form Data:
in0: 0
calctype: pos
in1: 1
in2: 1
in3: 0
drawtype: htmlcss

Это прекрасно работает в браузере, но когда я запускаю следующий запрос curl:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "in0=1&calctype=pos&in1=1&in2=1&in3=0&drawtype=htmlcss" -v http://www.32x8.com/circuits2

Я получаю этот вывод:

...
* Connected to www.32x8.com (2605:de00:1:1:4a:3c:0:42) port 80 (#0)
> POST /circuits2 HTTP/1.1
> Host: www.32x8.com

< Server: nginx
< Status: 301 Moved Permanently
< Location: http://www.32x8.com/var2.html
...

Я получаю ответ 301. Поэтому я попытался добавить флаг -L в команду, чтобы следовать любым перенаправлениям

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "in0=1&calctype=pos&in1=1&in2=1&in3=0&drawtype=htmlcss" -L -v http://www.32x8.com/circuits2

Но это просто дает мне этот вывод

...
> POST /circuits2 HTTP/1.1
> Host: www.32x8.com
> User-Agent: curl/7.52.1
> Accept: */*
> Content-Type: application/x-www-form-urlencoded
> Content-Length: 53
>
* upload completely sent off: 53 out of 53 bytes
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Wed, 01 May 2019 19:54:49 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Status: 301 Moved Permanently
...
* Switch from POST to GET
...
> POST /var2.html HTTP/1.1
> Host: www.32x8.com
> User-Agent: curl/7.52.1
> Accept: */*
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 405 Not Allowed
< Server: nginx
< Date: Wed, 01 May 2019 19:54:49 GMT
< Content-Type: text/html
< Content-Length: 173
< Connection: keep-alive
...

Я получаю 405. Что я делаю не так?

1 Ответ

1 голос
/ 02 мая 2019

Вы на самом деле не делаете ничего плохого, как таковой, но вы испытываете причуду HTTP, которая существует несколько лет назад и поддерживается cURL для совместимости.

Вы делаете POSTзапрос к вашему серверу, на который сервер отвечает сообщением 301 перенаправления.Когда вы просите cURL следовать за перенаправлением, он делает это, но изменяет POST на GET.Это поведение, унаследованное от прошлых поколений браузеров (здесь я не понимаю логику).Затем ваш сервер отклоняет запрос GET как недопустимый.

У вас есть два возможных решения: сообщение 301 указывает на постоянное перенаправление, поэтому просто используйте новый адрес (вам, вероятно, следует это сделать в любом случае)

Или в своем собственном коде определите сообщение 301 и выполните перенаправление самостоятельно, чтобы выполнить правильную команду POST.Это может означать, что вам нужен сценарий оболочки, а не просто cURL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...