MAC安装iTerm2和插件

MAC自带的终端不是很好用,还是iTerm用的舒服

安装iTerm2

  • 进入iTerm官方网站:https://iterm2.com 下载zip压缩包,将其解压后挪到application目录下即可完成安装;
  • 或者用Homebrew安装:打开电脑终端,命令行输入如下命令回车:
    1
    brew install iTerm2 

安装插件

安装oh-my-zsh和zsh-autosuggestion

安装oh-my-zsh

设置oh-my-zsh为默认shell,使用curl进行安装

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

输入如下命令,可以查看当前默认的shelll

1
echo $SHELL

安装zsh-autosuggestions

这是一个自动补全的插件,会自动根据输字符后出现之前的记录,按向右键确定

1
git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
  • 编辑~/.zshrc文件
    找到plugins=(git)这一行,然后再添加autosuggestions,最后为:
    1
    plugins=(git zsh-autosuggestions)
    重新打开命令行,当然你也可以source ./zshrc更新下你的zsh,这样你就可以使用oh-my-zsh的同时享受到autosuggestions带来的便利了.

iterm2快捷键

iTerm2 快捷键大全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
command + enter 进入与返回全屏模式
command + t 新建标签
command + w 关闭标签
command + 数字 command + 左右方向键 切换标签
command + enter 切换全屏
command + f 查找
command + d 水平分屏
command + shift + d 垂直分屏
command + option + 方向键 command + [ 或 command + ] 切换屏幕
command + ; 查看历史命令
command + shift + h 查看剪贴板历史
ctrl + u 清除当前行
ctrl + l 清屏
ctrl + a 到行首
ctrl + e 到行尾
ctrl + f/b 前进后退
ctrl + p 上一条命令
ctrl + r 搜索命令历史

安装出错情况

  • 安装oh-my-zsh时报错:

    1
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused

    是 raw.githubusercontent.com 这个域名ping不通,解决办法就是找到对应IP,改MAC的HOST;
    先去网站查询域名对应的IP地址:https://www.ipaddress.com/ 或者这个网站查 https://dnsdblookup.com/
    打开Finder,点击工具栏:前往-前往文件夹-输入 “/etc”,直接改不了hosts文件,复制hosts出来,记事本打开,在最后一行加上下面代码(这个IP是我查出来的),改好后覆盖掉etc里的hosts,会提示输入开机密码

    1
    185.199.109.133 raw.githubusercontent.com
  • 安装zsh-autosuggestions时报错,拉不了github代码,明明github官网能打开就是拉不了代码;
    原因:
    需要用https才能读到数据
    解决方法:输入命令

    1
    git config --global url."https://github.com".insteadOf git://github.com

    如果再次git clone出现报错:
    fatal: unable to access ‘https://github.com/robbyrussell/oh-my-zsh.git/’: LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

输入命令:

1
2
git config --global --unset http.proxy
git config --global --unset https.proxy

参考:
https://blog.csdn.net/qq_43531694/article/details/106862753
https://blog.csdn.net/kp783491236/article/details/125604734
https://blog.csdn.net/Jolting/article/details/125961694
https://blog.csdn.net/qq_44157558/article/details/126299709

Centos8安装Gogs

Gogs和GitHub非常相似,但是更适合服务器配置不高的用户,它占资源小;
Gogs的目标是打造一个最简单、最快速和最轻松的方式搭建自助Git服务。使用Go语言开发使得Gogs能够通过独立的二进制分发,并且支持Go语言支持的所有平台,包括Linux、Mac OS X、Windows以及 ARM 平台。

安装Mysql

安装mysql

1
yum install mariadb-server mariadb

启动mysql

1
2
3
4
systemctl start mariadb #启动MariaDB
systemctl stop mariadb #停止MariaDB
systemctl restart mariadb #重启MariaDB
systemctl enable mariadb #设置开机启动

mysql 中创建 gogs 数据库 和gogs用户
连接本地数据库,建立gogs数据库,并把权限赋予gogs用户

1
2
3
4
5
6
7
8
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> CREATE DATABASE gogs CHARACTER SET utf8 COLLATE utf8_bin;
mysql> GRANT ALL ON gogs.* TO 'gogs'@'localhost' IDENTIFIED BY 'YourPassword';
mysql> FLUSH PRIVILEGES;
mysql> exit;
[root@localhost ~]# useradd git
[root@localhost ~]# passwd git

下载Gogs并解压

1
//代码

https://zhuanlan.zhihu.com/p/356569771
https://www.jianshu.com/p/2df4c905c1d2
https://www.linuxprobe.com/centos8-gogs-git.html
http://www.gaodaima.com/414931.html

CSS常用点

  • 渐变

    1
    2
    background: #000000;
    background: linear-gradient(to bottom, #000000 0%,#ffffff 100%);
  • 阴影

    1
    2
    3
    4
    5
    //内阴影效
    box-shadow:5px 5px 5px #999 inset;

    //外部阴影
    box-shadow:5px 5px 5px #ddd;
  • 鼠标指针

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cursor: pointer;

    // 自定义鼠标样式,使用URL,并提供一个关键字值作为备用
    cursor: url("hyper.cur"), auto;

    // URL和xy的坐标偏移值,最后提供一个关键字值作为备用
    cursor: url(cursor1.png) 4 12, auto;
    cursor: url(cursor2.png) 2 2, pointer;

    // 全局属性
    cursor: inherit;
    cursor: initial;
    cursor: unset;
    指针明细
    类型 CSS值 描述
    General auto 浏览器根据当前内容决定指针样式
    例如当是内容是文字时使用text样式
    default 默认指针,通常是箭头。
    none 无指针被渲染
    链接及状态 context-menu 指针下有可用内容目录。
    help 指示帮助
    pointer 悬浮于连接上时,通常为手
    progress 程序后台繁忙,用户仍可交互 (与wait相反).
    wait 程序繁忙,用户不可交互 (与progress相反).图标一般为沙漏或者表。
    选择 cell 指示单元格可被选中
    crosshair 交叉指针,通常指示位图中的框选
    text 指示文字可被选中
    vertical-text 指示垂直文字可被选中
    拖拽 alias 复制或快捷方式将要被创建
    copy 指示可复制
    move 被悬浮的物体可被移动
    no-drop 当前位置不能扔下
    Windows或Mac OS X中 "no-drop 与not-allowed相同".
    not-allowed 不能执行
    grab

    可抓取

    译者注:grab和grabbing在比较后期才被支持,见浏览器兼容表

    grabbing 抓取中
    重设大小及滚动 all-scroll 元素可任意方向滚动 (平移).
    Windows中, "all-scrollmove相同".
    col-resize 元素可被重设宽度。通常被渲染为中间有一条竖线分割的左右两个箭头
    row-resize

    元素可被重设高度。通常被渲染为中间有一条横线分割的上下两个箭头

    n-resize 某条边将被移动。例如元素盒的东南角被移动时使用se-resize
    e-resize
    s-resize
    w-resize
    ne-resize
    nw-resize
    se-resize
    sw-resize
    ew-resize 指示双向重新设置大小
    ns-resize
    nesw-resize
    nwse-resize
    缩放 zoom-in

    指示可被放大或缩小

    zoom-out
    [点击查看浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/CSS/cursor#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)
  • 文字超出点点点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 一行显示,超出显示点点点
    p {
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
    }

    // 多行显示超出点点点
    .box {
    width: 400px; display:
    -webkit-box;-webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    }

Vue2.x升级到3

最主要的变化是在2的基础上加了个新的写法setup(){},新写法里没有熟悉的this,以及以前的一些写法都要改,要用2的写法也可以,用defineComponent()函数,vue3用TypeScript,用了3,相应配套的vuex、vue-router以及相关的组件库Vant3Element-plus都要升级起来,自然升级了有一堆的新语法要熟悉。

用2.X式写法

用全局API:defineComponent,就可以愉快的像2.0一样玩耍了
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script lang="ts">
import {defineComponent} from 'vue';
export default defineComponent({
name: 'demo',
data() {
return {
demo: '',
};
},
computed: {},
watch: {},
methods: {},
created() {},
mounted() {},
});
</script>

新加的写法

新的组合式API,把原来生命周期式函数都拧到一个大函数里了;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<script lang="ts">
import {ref, reactive, onMounted} from "vue";
import { useRoute } from "vue-router";

export default {
name: 'layout',
components:{},
setup() {
const data = reactive({demo:''});
const fn = ()=>{
// menus
}
return {
...data,
fn,
}
},
};
</script>

setup

生命周期

  • beforeCreate -> setup()
  • created -> setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured

ref

this

Mixin

tsconfig.json配置指南

TypeScript项目的配置文件
tsconfig.json放在ts项目的根目录下,tsconfig.json指定了用来编译这个项目的根文件和编译选项;
TSConfig文件可以是tsconfig.json或jsconfig.json,都具有相同的行为和相同的配置变量集。
官方参考链接

JSON文件是不支持注释的,只要跑的平台认,随便你写撒样都行,这几个可注释:

  • VS Code 的 settings.json
  • Prettier 的 .prettierrc
  • TypeScript 的 tsconfig.json

我在项目里用的tsconfig.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
"compilerOptions": {
"target": "esnext", // 目标代码类型
"module": "esnext", // 指定生成哪个模块系统代码
"strict": true, // 启用此功能等效于启用所有严格模式系列选项。
"jsx": "preserve", // 控制 JSX 在 JavaScript 文件中的输出方式。 这只影响 .tsx 文件的 JS 文件输出。
"importHelpers": true, //导入辅助:对于某些降级行为,TypeScript 使用一些辅助代码来进行操作
"moduleResolution": "node",//模块解析:指定模块解析策略 node、classic
"experimentalDecorators": true,// 启用实验性的ES装饰器
"skipLibCheck": true, // 跳过声明文件的类型检查
"esModuleInterop": true,//ES 模块互操作性
"allowSyntheticDefaultImports": true,// 允许合成默认导入
"sourceMap": true, // 用于debug ,生成相应的.map文件
"baseUrl": ".", // 解析非相对模块名的基准目录
"types": [ // 要包含的类型声明文件名列表;如果指定了types,只有被列出来的包才会被包含进来
"webpack-env"
],
"paths": { // 模块名到基于baseUrl的路径映射的列表
"@/*": [
"src/*"
]
},
"lib": [ //TypeScript 包括一组默认的内建 JS 接口(例如 Math)的类型定义,以及在浏览器环境中存在的对象的类型定义(例如 document)。 TypeScript 还包括与你指定的 target 选项相匹配的较新的 JS 特性的 API。例如如果target 为 ES6 或更新的环境,那么 Map 的类型定义是可用的。
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
"include": [ //指定要包含在程序中的文件名或模式的数组。这些文件名是相对于包含tsconfig.json文件的目录来解析的。
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts",
"tests/**/*.tsx"
],
"exclude": [ // 指定解析时应跳过的文件名或模式的数组include。
"node_modules"
]
}

网上别人的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
"compilerOptions": { //compilerOptions:编译选项,可以被忽略,这时编译器会使用默认值
"allowSyntheticDefaultImports": true, //允许从没有设置默认导出的模块中默认导入。这并不影响代码的显示,仅为了类型检查。
"baseUrl": "./src", //解析非相对模块名的基准目录
"emitDecoratorMetadata": true, //给源码里的装饰器声明加上设计类型元数据
"experimentalDecorators": true, //启用实验性的ES装饰器
"module": "commonjs", //指定生成哪个模块系统代码
"moduleResolution": "node", //决定如何处理模块。或者是"Node"对于Node.js/io.js,或者是"Classic"(默认)
"noEmitHelpers": true, //不再输出文件中生成用户自定义的帮助函数代码,如__extends。
"noImplicitAny": false, //在表达式和声明上有隐含的any类型时报错
"sourceMap": true, //用于debug ,生成相应的.map文件
"strictNullChecks": false, //在严格的null检查模式下,null和undefined值不包含在任何类型里,只允许用它们自己和any来赋值(有个例外,undefined可以赋值到void)。
"target": "es5", //目标代码类型
"paths": { //模块名到基于baseUrl的路径映射的列表
},
"lib": [ //编译过程中需要引入的库文件的列表
"dom",
"es6"
],
"types": [ //要包含的类型声明文件名列表;如果指定了types,只有被列出来的包才会被包含进来
"hammerjs",
"node",
"source-map",
"uglify-js",
"webpack"
]
},
"exclude": [ //如果"files"和"include"都没有被指定,编译器默认包含当前目录和子目录下所有的TypeScript文件(.ts, .d.ts 和 .tsx),排除在"exclude"里指定的文件。
"node_modules",
"dist"
],
"awesomeTypescriptLoaderOptions": { //Typescript加载选项
"forkChecker": true,
"useWebpackText": true
},
"compileOnSave": false,
"buildOnSave": false,
"atom": { "rewriteTsconfig": false }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
"compilerOptions": {
"incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度
"tsBuildInfoFile": "./buildFile", // 增量编译文件的存储位置
"diagnostics": true, // 打印诊断信息
"target": "ES5", // 目标语言的版本
"module": "CommonJS", // 生成代码的模板标准
"outFile": "./app.js", // 将多个相互依赖的文件生成一个文件,可以用在AMD模块中,即开启时应设置"module": "AMD",
"lib": ["DOM", "ES2015", "ScriptHost", "ES2019.Array"], // TS需要引用的库,即声明文件,es5 默认引用dom、es5、scripthost,如需要使用es的高级版本特性,通常都需要配置,如es8的数组新特性需要引入"ES2019.Array",
"allowJS": true, // 允许编译器编译JS,JSX文件
"checkJs": true, // 允许在JS文件中报错,通常与allowJS一起使用
"outDir": "./dist", // 指定输出目录
"rootDir": "./", // 指定输出文件目录(用于输出),用于控制输出目录结构
"declaration": true, // 生成声明文件,开启后会自动生成声明文件
"declarationDir": "./file", // 指定生成声明文件存放目录
"emitDeclarationOnly": true, // 只生成声明文件,而不会生成js文件
"sourceMap": true, // 生成目标文件的sourceMap文件
"inlineSourceMap": true, // 生成目标文件的inline SourceMap,inline SourceMap会包含在生成的js文件中
"declarationMap": true, // 为声明文件生成sourceMap
"typeRoots": [], // 声明文件目录,默认时node_modules/@types
"types": [], // 加载的声明文件包
"removeComments":true, // 删除注释
"noEmit": true, // 不输出文件,即编译后不会生成任何js文件
"noEmitOnError": true, // 发送错误时不输出任何文件
"noEmitHelpers": true, // 不生成helper函数,减小体积,需要额外安装,常配合importHelpers一起使用
"importHelpers": true, // 通过tslib引入helper函数,文件必须是模块
"downlevelIteration": true, // 降级遍历器实现,如果目标源是es3/5,那么遍历器会有降级的实现
"strict": true, // 开启所有严格的类型检查
"alwaysStrict": true, // 在代码中注入'use strict'
"noImplicitAny": true, // 不允许隐式的any类型
"strictNullChecks": true, // 不允许把null、undefined赋值给其他类型的变量
"strictFunctionTypes": true, // 不允许函数参数双向协变
"strictPropertyInitialization": true, // 类的实例属性必须初始化
"strictBindCallApply": true, // 严格的bind/call/apply检查
"noImplicitThis": true, // 不允许this有隐式的any类型
"noUnusedLocals": true, // 检查只声明、未使用的局部变量(只提示不报错)
"noUnusedParameters": true, // 检查未使用的函数参数(只提示不报错)
"noFallthroughCasesInSwitch": true, // 防止switch语句贯穿(即如果没有break语句后面不会执行)
"noImplicitReturns": true, //每个分支都会有返回值
"esModuleInterop": true, // 允许export=导出,由import from 导入
"allowUmdGlobalAccess": true, // 允许在模块中全局变量的方式访问umd模块
"moduleResolution": "node", // 模块解析策略,ts默认用node的解析策略,即相对的方式导入
"baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录
"paths": { // 路径映射,相对于baseUrl
// 如使用jq时不想使用默认版本,而需要手动指定版本,可进行如下配置
"jquery": ["node_modules/jquery/dist/jquery.min.js"]
},
"rootDirs": ["src","out"], // 将多个目录放在一个虚拟目录下,用于运行时,即编译后引入文件的位置可能发生变化,这也设置可以虚拟src和out在同一个目录下,不用再去改变路径也不会报错
"listEmittedFiles": true, // 打印输出文件
"listFiles": true// 打印编译的文件(包括引用的声明文件)
}

相关参考:
TypeScript项目中的tsconfig.json配置指南

JS中的小括号,中括号,大括号

总的来说,JavaScript中小括号有五种语义,中括号有四种语义,而大括号也有四种语义。

() 小括号:

  • 函数声明时参数表(形参)
  • 和一些语句联合使用以达到某些限定作用(if、for等)
  • 和new一起使用用来传值(实参)
  • 作为函数或对象方法的调用运算符(如果定义了参数也可与语义3一样传实参)
  • 强制表达式运算(常用有eval解析JSON和匿名函数自执行)

[] 中括号:

  • 声明数组
  • 取数组成员
  • 定义对象成员(可以不遵循标识符规则,可以以数字开头定义标识符)
  • 取对象成员

{}大括号:

  • 组织复合语句,这是最常见的
  • 对象直接量声明(赋值对象)
  • 声明函数或函数直接量赋值
  • 结构化异常处理的语法符号(try…catch语句)

资料来源:
JavaScript小括号、中括号、大括号的多义性

JavaScript原型对象与原型链

前端的兄弟面试多多少少被问到原型的问题,原型是什么?
网上文章太多了,写的很复杂,尤其是有一张像蚯蚓的图看的我头大,看了好多文章结合自己实践总结了下面一张图

JavaScript是一种基于原型的面向对象编程语言
引用mozilla的描述:
JavaScript 只有一种结构:对象。 每个实例对象(object)都有一个私有属性(称之为__proto__)指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象(proto) ,层层向上直到一个对象的原型对象为 null。
根据定义,null 没有原型,是原型链中的最后一个环节。
几乎所有 JavaScript 中的对象都是位于原型链顶端的 Object 的实例。`

对象分为两种:普通对象object和函数对象function;
概要:

  • function有__proto__属性和prototype属性,prototype属性是function独有的;
  • 对象都有__proto__属性,通过这个属性找到它的上级;
  • 数据类型:null、undefined是没有构造函数的
  • Object.prototype是所有对象的爸爸,Object.prototype原型是null。
foo
1
2
3
4
5
6
7
8
9
10
Object.prototype === {}.__proto__  //true,这个前后反过来写会报错,var a = {};a.__proto__ === Object.prototype;这样就不会

(1).__proto__ === Number.prototype //true,1是个值,要用强制运算符()

Function.__proto__ === Function.prototype //true
Function.prototype.__proto__ === Object.prototype //true
Function.__proto__.__proto__ === Object.prototype //true

Object.prototype.__proto__ === null //true
//...根据上面的图,你们可以一一对应找出对象的上级

原型链

上面的结构图可以看出来,对象的上级以及上级的上级一直到末端到null,这一整条链接关系就是原型链

参考资料:
继承与原型链
三张图搞懂JavaScript的原型对象与原型链
js基础篇——原型与原型链的详细理解

HTTP状态码

服务器常用状态码

状态码 含义
100 客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
101 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。   只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。
102 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted'。
202 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。   返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。
203 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超级。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
204 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。   如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。   由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
205 服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。   与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。   该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。   响应必须包含如下的头部域:   Content-Range 用以指示本次响应中返回的内容的范围;如果是 Content-Type 为 multipart/byteranges 的多段下载,则每一 multipart 段中都应包含 Content-Range 域用以指示本段的内容范围。假如响应中包含 Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。   Date   ETag 和/或 Content-Location,假如同样的请求本应该返回200响应。   Expires, Cache-Control,和/或 Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。   假如本响应请求使用了 If-Range 强缓存验证,那么本次响应不应该包含其他实体头;假如本响应的请求使用了 If-Range 弱缓存验证,那么本次响应禁止包含其他实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。否则,本响应就应当包含所有本应该返回200响应中应当返回的所有实体头部域。   假如 ETag 或 Last-Modified 头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与之前任何缓存过的内容组合在一起。   任何不支持 Range 以及 Content-Range 头的缓存都禁止缓存206响应返回的内容。
207 由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
300 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。   除非这是一个 HEAD 请求,否则该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由 Content-Type 定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动作出最合适的选择。当然,RFC 2616规范并没有规定这样的自动选择该如何进行。   如果服务器本身已经有了首选的回馈选择,那么在 Location 中应当指明这个回馈的 URI;浏览器可能会将这个 Location 值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的。
301 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。   新的永久性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。
302 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。   新的临时性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
303 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。   新的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   注意:许多 HTTP/1.1 版以前的 浏览器不能正确理解303状态。如果需要考虑与这些浏览器之间的互动,302状态码应该可以胜任,因为大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的。
304 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。   该响应必须包含以下的头信息:   Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将 Date 字段添加到接收到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。   ETag 和/或 Content-Location,假如同样的请求本应返回200响应。   Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。   假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁止包含其他实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。   假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。   假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值。
305 被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。   注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,而且只能被原始服务器建立。忽视这些限制可能导致严重的安全后果。
306 在最新版的规范中,306状态码已经不再被使用。
307 请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。   新的临时性的URI 应当在响应的 Location 域中返回。除非这是一个HEAD 请求,否则响应的实体中应当包含指向新的URI 的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的 URI 发出访问请求。   如果这不是一个GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
400 1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。   2、请求参数有误。
401 当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。参见RFC 2617。
402 该状态码是为了将来可能的需求而预留的。
403 服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息。
404 请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
405 请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。   鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。
406 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。   除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由 Content-Type 头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。
407  与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。参见RFC 2617。
408 请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
409 由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。   冲突通常发生于对 PUT 请求的处理中。例如,在采用版本检查的环境下,某次 PUT 提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本。
410 被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用404状态码。除非额外说明,否则这个响应是可缓存的。   410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。这类事件在限时、增值服务中很普遍。同样,410响应也被用于通知客户端在当前服务器站点上,原本属于某个个人的资源已经不再可用。当然,是否需要把所有永久不可用的资源标记为'410 Gone',以及是否需要保持此标记多长时间,完全取决于服务器拥有者。
411 服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
412 服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
413 服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。   如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。
414 请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:   本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。   重定向URI “黑洞”,例如每次重定向把旧的 URI 作为新的 URI 的一部分,导致在若干次重定向后 URI 超长。   客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操作请求的 URI,当 GET 后的参数超过某个数值后,可能会产生缓冲区溢出,导致任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码。
415 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
416 如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。   假如 Range 使用的是字节范围,那么这种情况就是指请求指定的所有数据范围的首字节位置都超过了当前资源的长度。服务器也应当在返回416状态码的同时,包含一个 Content-Range 实体头,用以指明当前资源的长度。这个响应也被禁止使用 multipart/byteranges 作为其 Content-Type。
417 在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。
421 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户。
422 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户。
422 请求格式正确,但是由于含有语义错误,无法响应。(RFC 4918 WebDAV)423 Locked   当前资源被锁定。(RFC 4918 WebDAV)
424 由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。(RFC 4918 WebDAV)
425 在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中。
426 客户端应当切换到TLS/1.0。(RFC 2817)
449 由微软扩展,代表请求应当在执行完适当的操作后进行重试。
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。   注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。
504 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。   注意:某些代理服务器在DNS查询超时时会返回400或者500错误
505 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。
506 由《透明内容协商协议》(RFC 2295)扩展,代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。
507 服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918)
509 服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用。
510 获取资源所需要的策略并没有没满足。(RFC 2774)

本文来源:HTTP状态码详解