草庐IT

http响应状态码(Header常见属性 — Location属性)

仲夏夜之梦~ 2023-04-03 原文

在介绍http协议的响应格式时,我们便已经提到了状态码的概念,因为http响应状态行中就包含了响应状态码和状态码的描述信息。下面就来详细了解什么是状态码。


目录

一、状态码

1、为什么要有状态码

2、状态码的分类

 3、浏览器如何看待状态码

二、重定向状态码 3**

1、重定向的分类

(1) 永久重定向

(2) 临时重定向

2、永久重定向验证

(1) Header常见属性 —— Location属性

(2) 代码测试


一、状态码

1、为什么要有状态码

当我们给服务器发送请求的时候,服务端会根据你的资源路径返回相应的内容。此时就存在多种情况了:

(1) 服务端找到你要的资源,把资源返回给你

(2) 服务端找不到你要的资源

(3) 服务端与客户端的连接断开

... ...

既然存在诸多情况,服务端必须要把自己的处理结果返回给客户端,让客户端知道并及时做出调整,这里的处理结果就是状态码,如 404 (Not Found) 、500 (Bad GateWay) 都是常见的状态码。

2、状态码的分类

状态码大致可以分为以下五大类,4**代表以4开头的状态码,如 404 (Not Found)

(1)  1** :信息性状态码,说明服务端正在处理接收到的请求。

(2)  2** :成功状态码,说明请求处理成功,并返回相应的资源。

(3)  3** :重定向状态码,一般用于网址的更换,比如当我们访问一个网站的时候,由于该网站的URL已经被废弃了,此时服务端会引导我们跳转到一个新的网站。

(4) 4** :客户端错误状态码,最典型的例子就是当服务端找不到我们请求的资源路径时,就会返回404状态码。

(5) 5**:服务端错误状态码,一般是服务端处理请求出错。

 3、浏览器如何看待状态码

状态码对浏览器而言没有任何指导意义,我们通过浏览器给服务端发送请求,服务端即便是返回404状态码,浏览器本身也不会有任何提示,我们所看到的页面,是服务端因为找不到资源路径,自己返回一个页面。

二、重定向状态码 3**

1、重定向的分类

3**的状态码是有特殊含义的,分为两种情况,永久重定向临时重定向。跟其他状态码不同,重定向是需要浏览器给我们提供支持的,浏览器必须3**状态码。服务端响应3**状态码时,服务端会告诉浏览器要跳转到哪个网址,此时就需要用到响应Header的Location属性

(1) 永久重定向

假设我们请求的资源路径是 /old/member,但是这个路径的内容因版本太旧被废弃了,你要的资源被移动到了其他路径 /new/staff ,此时服务器就会把你的请求路径 引导至 现在资源所在的路径。

说的通俗一点,当我们访问一个网站的时候,该网站的URL已经被废弃了,此时我们会跳转到一个新的网站。

(2) 临时重定向

当我们跳转到一个新网站的时候,一旦处理完对应的业务就会回到原本的网站,最典型的例子就是我们美团外卖下单以后,会跳转到支付页面,当支付完成的时候,会回到原本的订单页面。

2、永久重定向验证

(1) Header常见属性 —— Location属性

当浏览器响应的状态码为3**时,我们就需要用到这个属性,这个属性会告诉浏览器接下来要访问哪条资源路径。

Location: https://www.baidu.com         //告诉浏览器,接下来要跳转到百度页面
                                        //(也可以是自己服务器上的路径)   

(2) 代码测试

为了方便,我们测试的时候直接就重定向到 www.baidu.com,其实也可以重定向到自己服务器上的某个资源所在位置。

std::string http_response = "http/1.1 301 Permanently moved\n";    //响应状态行
http_response += "Location: https://www.baidu.com\n";              //重定向跳转位置

send(sock,http_response.c_str(),http_response.size(),0);

 

有关http响应状态码(Header常见属性 — Location属性)的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  5. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  6. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  7. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  10. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

随机推荐