HTTP请求URL不是HTTP请求头的一部分吗?

7
这是来自维基百科文章的摘录:
与仅发送URL和标头到服务器的GET请求方法相比,POST请求还包括消息正文。
基于此,看起来URL是与标头分开发送的,但如果是这样,为什么我们要在PHP中使用header()方法设置要重定向到的URL呢?
header("Location: http://google.com");

3
你把HTTP请求和HTTP响应混淆了。PHP的header函数是将一个新的头部添加到响应头中,GET和POST是请求方法。 - CaNNaDaRk
在我的回答中,你会看到一个请求和一个响应的示例,并且我会解释头部是什么样子的。 - CaNNaDaRk
3个回答

12

当你想要在浏览器中浏览一个URL时,你会键入一个URL。浏览器将URL放入HTTP请求中,如下所示:

GET /path/to/resource.php?var=data1&othervar=data2 HTTP/1.1
Host: example.com
Connection: keep-alive
"empty line"

然后,一个 Web 服务器会给你这样的回答:

HTTP/1.0 200 OK
Date: Fri, 02 Sep 2011 14:37:36 GMT
Server: Apache
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 149
Content-Type: text/javascript; charset=utf-8
Connection: keep-alive
"empty line"
"149 bytes of Response data"

像这样的每一行 "Header-Name: header_value\r\n" 都是一个头部。
PHP 的 header 函数在将响应发送到用户浏览器之前会向其添加一个头部。
在您的示例中,头部是:

Location: http://google.com

该行添加在最后一个标题之后,但在“空行”(只包含\r\n的行)之前。
POST请求与GET请求不同,因为你需要在“空行”之后添加请求正文:

POST /path/to/resource.php HTTP/1.1
Host: example.com
Connection: keep-alive
Content-Length: "number of bytes in the body"
"empty line"
variable=data&othervar=data2

总之,一个HTTP请求是这样进行的:

  1. 请求/响应行(POST或GET后跟请求的URL和HTTP版本,响应中HTTP版本后跟响应代码和响应字符串),并以\r\n结尾。
  2. 请求/响应头(header-name: header_value\r\n)。
  3. 空行(\r\n)。
  4. 响应/请求主体。

PS. 行始终由"\r\n"字节关闭(“空行”只由这两个字节组成)。


第一个引号 GET /path... 是请求头的一部分吗? - Emanuil Rusev
3
并不是,"GET ... HTTP/1.1" 和 "POST ... HTTP/1.1" 是请求行,并且后面跟着请求头。 - CaNNaDaRk
那么说 Location: ... 头部就像是一个新的 HTTP 请求的指令,这样说就正确了吗? - Emanuil Rusev
是的,“Location: redirect_url”是一个头部,它告诉您的浏览器向该URL发出新请求。 - CaNNaDaRk

2

header()方法可以向文件添加头信息。

如果您想设置Content-Type,请使用以下代码:

header("Content-type: text/javascript");

等等其他的内容...

Location 是你可以使用php header()函数设置和/或更改的另一个标题。

文档中得知:

第二种特殊情况是“Location:”头。它不仅将此头发送回浏览器,而且除非已经设置了201或3xx状态代码,否则还会向浏览器返回重定向(302)状态代码。


这是另一个摘录(这次来自PHP文档):header()用于发送原始的HTTP头。 - Emanuil Rusev
@Emanuil ... 所有的头部都被“发送”了... 这就是头部的概念...请阅读我的答案更新。 - Naftali
你似乎是对的。应该是“添加”而不是“发送”。 - Emanuil Rusev

0

有响应头和请求头

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

在 PHP 中,您可以将位置标头设置为请求的响应。浏览器查看响应并相应地执行。

因此,当您访问原始页面时,位置标头会告诉浏览器去其他地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接