Я попробовал следующую команду openssl s_client -connect google.com:443 и смог соединиться с google.com через SSL.

Но когда я попытался получить какой-то ресурс, используя GET /?q=cats HTTP/1.1 <enter> Host google.com <enter><enter> тогда я получил сообщение ниже:

HTTP/1.1 400 Bad Request
Date: Wed, 19 Aug 2015 21:12:02 GMT
Server: Apache
Content-Length: 307
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Request header field is missing ':' separator.<br />
<pre>
Host google.com</pre>
</p>
</body></html>
closed

Если я не укажу какую-либо версию HTTP и использую GET /?q=cats <enter> тогда я получаю ответ ниже. В ответе я вижу правильный URL-адрес https://www.google.co.in/?q=cats&gws_rd=cr&ei=yPPUVYeVApGzuATIkpuQCw и если я использую его в браузере, он работает.

Я пропускаю некоторые заголовки или что-то еще?

HTTP/1.0 302 Found
Location: https://www.google.co.in/?q=cats&gws_rd=cr&ei=yPPUVYeVApGzuATIkpuQCw
Cache-Control: private
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Wed, 19 Aug 2015 21:23:20 GMT
Server: gws
Content-Length: 273
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1440019400:LM=1440019400:V=1:S=fdzyHaeMMBcBYPPy; expires=Fri, 18-Aug-2017 21:23:20 GMT; path=/; domain=.google.com
Set-Cookie: NID=70=Xxap0a_fYjPIwnvwUuyUqKaT6UH6ZjttA6zv6CYv8qVGMCuOEyNRc8hR2JCi1X_8522QMF2OpsG9dDrWphQh-df0orBmG-DC0WCTF9A_YVJYp3YSgQyap5GlL11EBjff; expires=Thu, 18-
Feb-2016 21:23:20 GMT; path=/; domain=.google.com; HttpOnly
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; p="1"; ma=604800

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.in/?q=cats&amp;gws_rd=cr&amp;ei=yPPUVYeVApGzuATIkpuQCw">here</A>.
</BODY></HTML>
read:errno=0

Другой вид ответа 302.

**GET / HTTP/1.1
Host: www.google.com**

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: https://www.google.co.in/?gfe_rd=cr&ei=7_3UVfDeCuPI8AeMkZzwDQ
Content-Length: 262
Date: Wed, 19 Aug 2015 22:06:39 GMT
Server: GFE/2.0
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; p="1"; ma=604800

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.in/?gfe_rd=cr&amp;ei=7_3UVfDeCuPI8AeMkZzwDQ">here</A>.
</BODY></HTML>

1 ответ1

5

Когда Google говорит

Request header field is missing ':' separator.

На самом деле они имеют в виду, что в поле заголовка в запросе должен использоваться разделитель ':'.

Таким образом, вместо отправки этого:

GET /?q=cats HTTP/1.1<enter> 
Host google.com<enter>
<enter>

Вам необходимо отправить это:

GET /?q=cats HTTP/1.1<enter> 
Host: google.com<enter>
<enter>

(Обратите внимание: разделение "Хост" и "google.com")

Как только это закончится, вы получите 302:

HTTP/1.0 302 Found
Location: https://www.google.co.in/?q=cats&gws_rd=cr&ei=yPPUVYeVApGzuATIkpuQCw

Я фактически получаю 301 по тому же запросу:

HTTP/1.1 301 Moved Permanently
Location: https://www.google.com/?q=cats

Это не ответы об ошибках, это ответы перенаправления. Google услышал наш запрос и хотел бы, чтобы мы повторили запрос по-другому. В моем случае мне сказали, что я не должен спрашивать «google.com», я должен спрашивать «www.google.com», и я должен помнить об этом в следующий раз. В вашем случае он хотел, чтобы вы зашли на сайт www.google.co.in и использовали другую строку запроса - предположительно, вы находитесь в Индии, и они хотят, чтобы вы выбрали локальную версию Google. Что касается желания использовать другую строку запроса, то это обычные параметры строки запроса Google (gws_rd, ei); они просто уточняют ваш запрос для вас.

Это нормальное поведение веб-приложения. Вы создали запрос вручную. Веб-приложению (Google) не понравились некоторые аспекты вашего запроса, и он переписал его, чтобы он был более совместим с тем, что произошло бы, если бы вы зашли в обычный браузер и искали "кошек". Затем они передали этот новый URL вашему клиенту (в данном случае openssl) и сказали, чтобы он снова спросил. Но так как вы делаете это вручную, вы больше не спрашиваете, а вместо этого неправильно истолковали это как условие ошибки.

Если я сделаю так, как они просят, и повторю мой запрос, но с Host: www.google.com вместо Host: google.com , я получу результаты, которые вы ожидаете, если будете искать кошек.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .