在一个月前,腾讯各个BG针对了419这个话题狠狠地搞了一波事,做出了许许多多响应码是419的网页,附带上各种骚文案,真的不愧是BAT三大家中的最强产品。

这不,过去的520我也学着搞了一波事情。今天,我会让你们的操作也像他们一样骚,会简单地借这个状态码搞事情!

由于HTTP是基于文本的协议(HTTP/2除外),所以在传输过程中全程使用我们可以识别的文字进行通信。在响应头中,第一行就包含了HTTP版本和状态,以及状态phrase。

HTTP/1.1 200 OK

相信这个东西,大家都不会陌生。接下来,需要请到的是nginx傻瓜化自定义状态码的配置两个句式。

return

很明显,就是返回相应状态码的意思。这时候,它的用法也有两种:

  • return <code>
  • return <code> <content>

其中code明显是我指定的的状态码,范围是1到999;
而下一个参数代表的是,返回这个状态码的同时携带的正文内容。

如果code为301或302等跳转型状态码时,content也可以代表跳转的路径。

error_page

error_page <code> <path>

这个语句的作用主要是用于自定义各状态码的错误页面的。参数意义如下:

  • code – 对应的状态码
  • path – 错误页面对应的路径

其中,需要对这个path稍稍深纠一下。因为这里的行为有两种:
直接映射跳转

假定几种情况说一下会发生的事情:

  • 一个绝对路径 – 直接映射
  • 一个相对路径 – 跳转
  • 一个http/https的URL – 跳转

如果路径的填写涉及到跳转,那么在跳转之后,客户端最终收到的状态码其实是一个302 Found与最终跳转路径的状态码。所以要搞事的话,我们只能选择上面这种直接映射的方案。

这些情况需要耐心进行尝试以及调整,如果还是翻车了,那我的建议其实是查找更多的文档。

关于路径路由的碎碎念

其实对于nginx来说,其中的结构无非就是建立了无数个location块,然后匹配落入。经过刚刚使用这两个句式,我们使得一个URL返回到了我们想要的状态码以及想要的内容。然而简单的return语句并不能满足我们,所以在error_page中我们直接映射到了一个路径中。

与其说是直接映射,对于nginx,其实是使得这个请求落入到了对应路径的一个或多个location块中,而其变量不发生改变。这就意味着,如果你捕捉的路径是/foo/,而映射的路径是/bar/,那么nginx会使用/bar/的location语句块进行处理,但传递的路径是/foo/。

所以总结起来,我的配置如下:

error_page 520 /index.php
location /generate_520/ {
    return 520;
}

捕捉/generate_520/的请求,返回520状态码,并交由/index.php处理。然后在WordPress上建立了一个如此路径的页面,就可以正常地返回我们需要的内容。

可以了,完成任务,溜溜球哈哈哈!


明天下午还要面试猪厂,要好好休息啦~
晚安噜!

alphaxz@SCUT