网络协议-HTTP协议详解-URL与资源
前面介绍了 Web 的由来与兴起,以及承载 Web 通信的 HTTP 协议的总体概述,接下来我们将围绕 HTTP 协议的细节具体展开讨论,包括 HTTP 报文、请求、响应、Web 服务器、HTTPS、认证、构建 Web 内容的技术以及 Web 安全等,首先我们从 Web 资源的入口 —— URL 开始。
浏览互联网资源
前面在概述篇中我们已经提到,URL 是统一资源定位符(Uniform Resource Location)的英文缩写,是浏览器寻找信息时所需的资源位置描述,通过 URL,才能找到、使用并共享互联网上大量的数据资源。
URI(统一资源标识符)是一类更通用的资源标识符,URL 实际上是它的一个子集。URI 是一个通用的概念,有两个主要的子集 URL 和 URN 构成,URL 是通过描述资源的位置来标识资源的,而 URN 则是通过名字来识别资源的,与它们当前所处的位置无关。
HTTP 规范将更通用的概念 URI 作为其资源标识符,但实际上,HTTP 应用程序处理的只是 URI 的 URL 子集。
以 https://laravelacademy.org/programmer-internal-skills-series
为例,URL 分为以下三个部分:
- URL 的第一个部分是方案(scheme),这里是 https(怎样访问资源)。
- URL 的第二个部分是域名(host),告知资源位于何处(服务器的位置),这里是
laravelacademy.org
。 - URL 的第三个部分是资源路径,说明了请求服务器上哪个特定的本地资源,这里是
/programmer-internal-skills-series
。
URL 语法
URL 的语法因方案不同而略有差异,大多数 URL 方案的 URL 语法都建立在这个由 9 个部分组成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
以下是上述每个部分的描述信息:
我们日常看到的 URL 大多是 <scheme>://<host>/<path>?<query>#<frag>
这种格式,包含其他组件的 URL 很少见,因为 Web 资源大多是免费的,即使需要认证也是通过服务器端技术基于 Cookie + Session 来实现,显示指定不安全,存在诸多问题,关于认证部分,我们后面会单独讲到;而「端口」一般都是隐藏的,对于 http 而言,默认端口号是 80,对于 https 而言,默认端口号是 443;至于「参数」,通常我们将其放到「查询」字符串中,比如 https://laravelacademy.org/search?keyword=laravel
;片段用于在当前文档中定位到某个片段,比如 https://laravelacademy.org/programmer-internal-skills-series#data-structure-and-algorithm
,要结合 HTML 锚点才能实现。
URL 编码
URL 通常使用 ASCII 字符集,对于不安全的字符则使用「%+两个ASCII码的十六进制数」进行编码,以便在任何系统中都可以被解析,从而实现可移植性和完整性。
客户端应用程序在向其他应用程序发送任意 URL 之前最好把所有不安全或受限字符进行编码。在 PHP 中,我们通常使用 urlencode 对 URL 进行编码。
URL scheme
URL 方案(scheme)除了常见的 http 和 https 之外,还有很多其他方案,比如 ftp、mailto、file 等,这些我们平时偶尔也会在浏览器地址栏中用到,不同方案的 URL 格式基本一致:
ftp
:从 FTP 服务器上传或下载文件,一般格式为ftp://<user>:<password>@<host>:<port>/<path>;<params>
;rtsp、rtspu
:可以通过实时流传输协议解析的音视频媒体资源的标识符,一般格式为rtsp://<user>:<password>@<host>:<port>/<path>
;mailto
:指向的是电子邮箱地址,比如mailto:yaojinbu@outlook.com
,访问该 URL 会向指定邮箱用户发送邮件;file
:表示一台指定主机上可以直接访问的文件,一般用于本地、网络文件系统或其他文件共享系统(比如网络邻居)文件的访问,一般格式为file://<host>/<path>
;news
:可用于访问特定的文章或新闻组;telnet
:用于访问交互式业务,表示的并不是对象自身,而是可通过 TELNET 访问的交互式应用程序
相关资源
更多关于 URL 的信息,可以参考以下资源:
原文地址:https://www.cnblogs.com/stringarray/p/12976466.html
- HDUOJ-----1066Last non-zero Digit in N!
- Golang语言社区-【基础知识】切片
- Oracle和MySQL的高可用方案对比(一)
- golang取两个数字之间的随机数
- MySQL 5.5复制升级到5.7的一点简单尝试
- go语言读取CSV文件
- 从Baa开发中总结Go语言性能渐进优化
- GOLANG 中HTTP包默认路由匹配规则阅读笔记
- Go语言基本语法
- HDUOJ----2063过山车
- HDUOJ------Worm
- 由小见大-MySQL脚本部署中的一些策略
- HDUOJ-------2149Public Sale
- HDUOJ--1159Common Subsequence
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode38|根据字符出现频率排序
- 搭建简易的物联网服务端和客户端-Nodejs_PM2(十八)
- spring boot 项目中自动执行 sql 语句
- 搭建简易的物联网服务端和客户端-邮件通知(十九)
- LeetCode37|两颗二叉搜索树中所有元素
- LeetCode45|数组中重复的数据
- 搭建简易的物联网服务端和客户端-网络控制(二十)
- LeetCode44|在每个树行中找最大值
- LeetCode43|最大层内元素和
- 搭建简易的物联网服务端和客户端-Maibu控制(二十一)
- LeetCode42|层数最深叶子节点的和
- LeetCode41|数组中数组出现的次数
- Django后台管理界面修改(源文件修改)
- 前端工程师不可不知的Nginx知识
- Django1.11 简单登录注册