-
在现代 Web 开发中,性能优化是提升用户体验和降低服务器成本的核心环节。而在众多优化手段中,HTTP 缓存因其简单高效、效果显著,成为前端与后端开发者必须掌握的基础能力。合理的缓存策略不仅能大幅减少网络请求、加快页面加载速度,还能有效减轻源服务器负载。本文将系统讲解 HTTP 缓存的工作原理、核心头部字段、验证机制及实际应用策略,帮助开发者构建高性能的 Web 应用。一、HTTP 缓存的基本原理HTTP 缓存是指浏览器或其他中间代理(如 CDN)将服务器返回的响应内容临时存储,在后续相同请求中直接使用本地副本,而无需再次向源服务器发起完整请求。这种机制基于“内容在一段时间内不会频繁变化”的假设,适用于静态资源(如图片、CSS、JS)以及部分动态内容。HTTP 缓存分为两类:强缓存(Strong Cache):直接使用本地缓存,不与服务器通信。协商缓存(Revalidation Cache):向服务器确认缓存是否仍有效,若有效则返回 304 Not Modified,避免重复传输内容。整个流程由 HTTP 响应头中的特定字段控制,客户端根据这些指令决定如何处理缓存。二、强缓存:通过过期时间控制强缓存的核心在于设置资源的有效期,一旦在有效期内,浏览器将直接使用本地缓存,不会发送请求到服务器(地址栏回车或新标签页打开除外)。1. Cache-ControlCache-Control 是 HTTP/1.1 引入的标准头部,优先级高于旧的 Expires 字段。常用指令包括:max-age=<seconds>:指定资源在多少秒内有效Cache-Control: max-age=3600表示该资源在 1 小时内可被直接使用。public / private:public 表示响应可被任何缓存(包括 CDN、代理)存储private 表示仅用户浏览器可缓存,中间代理不得缓存(适用于含用户私有信息的内容)no-cache:不使用强缓存,但可使用协商缓存(每次需验证)no-store:禁止任何形式的缓存,敏感数据(如银行页面)应使用此指令2. ExpiresExpires 是 HTTP/1.0 的遗留字段,指定一个绝对过期时间(GMT 格式):Expires: Wed, 21 Nov 2025 10:00:00 GMT由于依赖客户端时间,易受时钟偏差影响,现代开发中应优先使用 Cache-Control: max-age。三、协商缓存:验证缓存有效性当强缓存过期后,浏览器会向服务器发起请求,但会携带缓存验证信息。服务器根据这些信息判断资源是否已更新,若未更新则返回 304 状态码,告知客户端继续使用本地缓存。协商缓存依赖两组头部字段:1. Last-Modified 与 If-Modified-Since服务器在首次响应中返回 Last-Modified,表示资源最后修改时间:Last-Modified: Mon, 18 Nov 2025 08:30:00 GMT后续请求中,浏览器自动添加 If-Modified-Since:If-Modified-Since: Mon, 18 Nov 2025 08:30:00 GMT服务器比较该时间与当前资源修改时间:若未修改,返回 304 Not Modified(无响应体)若已修改,返回 200 OK 及新内容局限性:若资源在 1 秒内多次修改,Last-Modified 无法精确识别变化。2. ETag 与 If-None-Match为解决上述问题,HTTP/1.1 引入了 ETag(Entity Tag),它是资源的唯一标识符(通常为内容哈希值):首次响应:ETag: "a1b2c3d4e5"后续请求:If-None-Match: "a1b2c3d4e5"服务器比对 ETag:相同 → 返回 304不同 → 返回 200 和新内容ETag 精度更高,但计算哈希可能带来 CPU 开销。对于静态文件,Web 服务器(如 Nginx)通常基于文件 inode 和修改时间生成弱 ETag(以 W/ 开头),兼顾效率与准确性。四、实际应用中的缓存策略1. 静态资源:长期强缓存 + 文件指纹对于 CSS、JS、图片等静态资源,推荐采用“永久缓存 + 内容哈希”的策略:构建时为文件名添加哈希值:app.a1b2c3.js设置 Cache-Control: max-age=31536000(1 年)当内容变更时,文件名随之改变,浏览器自动请求新资源此方案确保用户始终获取最新版本,同时最大化利用缓存。2. HTML 页面:短时效或协商缓存HTML 通常作为入口文件,内容可能频繁变化,不宜长期缓存。建议:设置 Cache-Control: no-cache,强制每次验证或使用较短的 max-age(如 60 秒)配合 must-revalidate3. API 接口:按需配置公共数据(如城市列表):可设置较长缓存时间用户私有数据:使用 private + 短 max-age 或 no-cache敏感操作(如支付结果):使用 no-store五、常见问题与注意事项强制刷新行为用户按下 Ctrl+F5(Windows)或 Cmd+Shift+R(Mac)时,浏览器会忽略缓存并发送带 Cache-Control: no-cache 的请求。CDN 缓存与源站缓存分离CDN 通常遵循自身的缓存规则,可能覆盖源站的 Cache-Control。需在 CDN 控制台单独配置缓存策略。Service Worker 的影响若使用 PWA 技术,Service Worker 可完全接管请求,此时 HTTP 缓存可能被绕过,需在 SW 脚本中显式处理缓存逻辑。避免缓存污染对包含用户身份信息的 URL(如 /api/profile?user=123),确保不同用户的响应不会被错误共享,可通过设置 private 或使用认证头隔离。六、结语HTTP 缓存机制是 Web 性能优化的基石之一。通过合理配置 Cache-Control、ETag 等头部字段,开发者可以在不改动业务逻辑的前提下,显著提升页面加载速度和系统吞吐量。然而,缓存也是一把双刃剑——配置不当可能导致用户看到过期内容或资源无法更新。因此,理解其工作原理,并结合项目特点制定清晰的缓存策略,是每个 Web 开发者必备的能力。在实践中,建议结合浏览器开发者工具的 Network 面板,实时观察缓存命中情况,持续优化缓存配置。
-
HTTP协议虽然我们说,应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用.HTTP(超文本传输协议)就是其 中之一。在互联网世界中,HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如HTML文档)。 HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个无连接、无状态的协 议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。认识URL平时我们俗称的"网址"其实就是说的URL urlencode和urldecode像/?:等这样的字符,已经被url当做特殊意义理解了.因此这些字符不能随意出现.比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义. 转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位 做一位,前面加上%,编码成%XY格式。如下图搜索C++中"+" 被转义成了"%2B" urldecode 就是urlencode的逆过程;在线编码工具:http://tool.chinaz.com/tools/urlencode.aspx选中其中的URL编码/解码模式,在输入C++后点击编码就能得到编码后的结果。 同理C%2B%2B点击解码就会得到C++HTTP协议请求与响应格式HTTP请求HTTP请求协议格式如下: HTTP请求由以下四部分组成:请求行:[请求方法]+[url]+[http版本]请求报头:请求的属性,这些属性都是以key: value的形式按行陈列的。空行:遇到空行表示请求报头结束。请求正文:请求正文允许为空字符串,如果请求正文存在,则在请求报头中会有一个Content-Length属性来标识请求正文的长度。其中,前面三部分是一般是HTTP协议自带的,是由HTTP协议自行设置的,而请求正文一般是用户的相关信息或数据,如果用户在请求时没有信息要上传给服务器,此时请求正文就为空字符串。代码如下class HttpRequest{public: HttpRequest() { } std::string Serialize() { return std::string(); } void ParseReqLine(std::string &reqline) { // GET / HTTP/1.1 std::stringstream ss(reqline); ss >> _method >> _uri >> _version; } bool Deserialize(std::string &reqstr) { // 1. 提取请求行 std::string reqline; bool res = Util::ReadOneLine(reqstr, &reqline, glinespace); LOG(LogLevel::DEBUG) << reqline; // 2. 对请求行进行反序列化 ParseReqLine(reqline); if (_uri == "/") _uri = webroot + _uri + homepage; // ./wwwroot/index.html else _uri = webroot + _uri; // ./wwwroot/a/b/c.html LOG(LogLevel::DEBUG) << "_method: " << _method; LOG(LogLevel::DEBUG) << "_uri: " << _uri; LOG(LogLevel::DEBUG) << "_version: " << _version; // ./wwwroot/XXX.YYY return true; } std::string Uri() { return _uri; } ~HttpRequest() { } private: std::string _method; // 请求方法 std::string _uri; // URI std::string _version; // HTTP版本 std::unordered_map<std::string, std::string> _headers; // 请求报头 std::string _blankline; // 空行 std::string _text; // 请求正文};AI写代码cpp运行HTTP响应HTTP响应由以下四部分组成:状态行:[http版本]+[状态码]+[状态码描述]响应报头:响应的属性,这些属性都是以key: value的形式按行陈列的。空行:遇到空行表示响应报头结束。响应正文:响应正文允许为空字符串,如果响应正文存在,则响应报头中会有一个Content-Length属性来标识响应正文的长度。比如服务器返回了一个html页面,那么这个html页面的内容就是在响应正文当中的。 代码如下:class HttpResponse{public: HttpResponse() : _blankline(glinespace), _version("HTTP/1.0") { } // 实现: 成熟的http,应答做序列化,不要依赖任何第三方库! std::string Serialize() { std::string status_line = _version + gspace + std::to_string(_code) + gspace + _desc + glinespace; std::string resp_header; for (auto &header : _headers) { std::string line = header.first + glinesep + header.second + glinespace; resp_header += line; } return status_line + resp_header + _blankline + _text; } void SetTargetFile(const std::string &target) { _targetfile = target; } void SetCode(int code) { _code = code; switch (_code) { case 200: _desc = "OK"; break; case 404: _desc = "Not Found"; break; default: break; } } bool MakeResponse() { bool res = Util::ReadFileContent(_targetfile, &_text); // 浏览器请求的资源,一定会存在吗?出错呢? if (!res) { SetCode(404); _targetfile=webroot+page_404; Util::ReadFileContent(_targetfile, &_text); } SetCode(200); return true; } bool Deserialize(std::string &reqstr) { return true; } ~HttpResponse() {} public: std::string _version; int _code; // 404 std::string _desc; // "Not Found" std::unordered_map<std::string, std::string> _headers; std::string _blankline; std::string _text; // 其他属性 std::string _targetfile;};AI写代码cpp运行Http类class Http{public: Http(uint16_t port) : tsvrp(std::make_unique<TcpServer>(port)) { } void HandlerHttpRquest(std::shared_ptr<Socket> &sock, InetAddr &client) { // 1. 接收HTTP请求数据 std::string httpreqstr; int n = sock->Recv(&httpreqstr); // 读取请求数据 if (n > 0) { // 2. 解析HTTP请求 HttpRequest req; req.Deserialize(httpreqstr); // 3. 生成HTTP响应 HttpResponse resp; resp.SetTargetFile(req.Uri()); // 设置目标文件路径 resp.MakeResponse(); // 读取文件内容或返回404 // 4. 发送响应 std::string response_str = resp.Serialize(); sock->Send(response_str); }} void Start() { tsvrp->Start([this](std::shared_ptr<Socket> &sock, InetAddr &client) { this->HandlerHttpRquest(sock, client); }); } ~Http() { } private: std::unique_ptr<TcpServer> tsvrp;};AI写代码cpp运行服务器代码#include "Http.hpp" //http portint main(int argc, char *argv[]){ if(argc != 2) { std::cout << "Usage: " << argv[0] << " port" << std::endl; exit(USAGE_ERR); } uint16_t port = std::stoi(argv[1]); std::unique_ptr<Http> httpsvr = std::make_unique<Http>(port); httpsvr->Start(); return 0;}AI写代码cpp运行http协议底层代码还是TCP socket,我们在服务器创建Http类的智能指针,并启动服务器在Start()函数中使用lambda表达式捕获类中的HandlerHttpRquest()在HandlerHttpRquest()中1. 接收HTTP请求数据当你在浏览器中输入网址(如 http://106.54.48.112:8080/index.html)并访问时,浏览器会通过 TCP 连接向你的服务器发送 HTTP 请求数据。你的服务器通过 sock->Recv()读取的正是浏览器发送的原始 HTTP 请求数据。2. 解析HTTP请求在HTTP请求类中实现的反序列化读取_method , _uri , _version,主要是获得uri这样就可以访问服务器上wwwroot目录下的资源。3. 生成HTTP响应在获得HTTP请求后,要告诉浏览器资源的路径即设置路径,然后完成响应。在 MakeResponse方法中调用Util::ReadFileContent(_targetfile, &_text)的目的是读取客户端请求的目标文件内容(106.54.48.112:8080/index.html),并将其存储到 HTTP 响应的 _text 成员变量中,以便后续通过 Serialize()方法将文件内容作为 HTTP 响应正文返回给浏览器4. 发送响应即把序列化后的字符串发给浏览器注:在请求与响应中要严格按照图片中的结构完成序列化,否则浏览器与服务器无法建立连接// 工具类 class Util{public: static bool ReadFileContent(const std::string &filename, std::string *out) { // version1 std::ifstream in(filename); if (!in.is_open()) { return false; } std::string line; while (std::getline(in, line)) { *out += line; } in.close(); return true; } static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep /*\r\n*/) { auto pos = bigstr.find(sep); if (pos == std::string::npos) return false; *out = bigstr.substr(0, pos); bigstr.erase(0, pos + sep.size()); return true; } static int FileSize(const std::string &filename) { std::ifstream in(filename, std::ios::binary); if (!in.is_open()) return -1; in.seekg(0, in.end); int filesize = in.tellg(); in.seekg(0, in.beg); in.close(); return filesize; }};AI写代码cpp运行index.html以ai帮我们完成网址首页为例<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Default Home Page</title> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f4f4f4; color: #333; } header { background-color: #007bff; color: #fff; padding: 10px 20px; text-align: center; } nav { background-color: #343a40; padding: 10px 0; } nav a { color: #fff; text-decoration: none; padding: 10px 20px; display: inline-block; } nav a:hover { background-color: #5a6268; } .container { padding: 20px; } .welcome { text-align: center; margin-bottom: 20px; } .welcome h1 { margin: 0; } .content { background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } footer { background-color: #343a40; color: #fff; text-align: center; padding: 10px 0; position: fixed; width: 100%; bottom: 0; } </style></head><body> <header> <h1>Welcome to Our Website</h1> </header> <nav> <a href="#">Home</a> <a href="Login.html">Login</a> <!-- 跳转到登录页面 --> <a href="Register.html">Register</a> <!-- 跳转到注册页面 --> <a href="#">About</a> <a href="#">Contact</a> </nav> <div class="container"> <div class="welcome"> <h1>Welcome to Our Default Home Page</h1> <p>This is a simple default home page template.</p> </div> <div class="content"> <h2>Introduction</h2> <p>This is a basic HTML template for a default home page. It includes a header, navigation bar, a welcome section, and a content area. You can customize this template to suit your needs.</p> </div> </div> <footer> <p>© 2025 Your Company Name. All rights reserved.</p> </footer></body></html>AI写代码cpp运行代码效果服务器日志的消息 浏览器输入服务器ip+端口号 网址默认首页 HTTP的方法HTTP常见的方法如下:方法说明支持的HTTP协议版本GET获取资源1.0、1.1POST传输实体主体1.0、1.1PUT传输文件1.0、1.1HEAD获得报文首部1.0、1.1DELETE删除文件1.0、1.1OPTIONS询问支持的方法1.1TRACE追踪路径1.1CONNECT要求用隧道协议连接代理1.1LINK建立和资源之间的联系1.0UNLINE断开连接关系1.0其中最常用的就是GET方法和POST方法。GET方法和POST方法GET方法一般用于获取某种资源信息,而POST方法一般用于将数据上传给服务器。但实际我们上传数据时也有可能使用GET方法,比如百度提交数据时实际使用的就是GET方法。GET方法和POST方法都可以带参:GET方法是通过url传参的。POST方法是通过正文传参的。从GET方法和POST方法的传参形式可以看出,POST方法能传递更多的参数,因为url的长度是有限制的,POST方法通过正文传参就可以携带更多的数据。此外,使用POST方法传参更加私密,因为POST方法不会将你的参数回显到url当中,此时也就不会被别人轻易看到。不能说POST方法比GET方法更安全,因为POST方法和GET方法实际都不安全,要做到安全只能通过加密来完成HTTP的状态码HTTP的状态码如下:类别 分类 原因短语1XX Informational(信息性状态码) 接收的请求正在处理2XX Success(成功状态码) 请求正常处理完毕3XX Redirection(重定向状态码) 需要进行附加操作以完成请求4XX Client Error(客户端错误状态码) 服务器无法处理请求5XX Server Error(服务器错误状态码) 服务器处理请求出错最常见的状态码,比如200(OK),404(Not Found),403(Forbidden请求权限不够),302(Redirect),504(Bad Gateway)。Redirection(重定向状态码)重定向就是通过各种方法将各种网络请求重新定个方向转到其它位置,此时这个服务器相当于提供了一个引路的服务。重定向又可分为临时重定向和永久重定向,其中状态码301表示的就是永久重定向,而状态码302和307表示的是临时重定向。临时重定向和永久重定向本质是影响客户端的标签,决定客户端是否需要更新目标地址。如果某个网站是永久重定向,那么第一次访问该网站时由浏览器帮你进行重定向,但后续再访问该网站时就不需要浏览器再进行重定向了,此时你访问的直接就是重定向后的网站。而如果某个网站是临时重定向,那么每次访问该网站时如果需要进行重定向,都需要浏览器来帮我们完成重定向跳转到目标网站。临时重定向演示进行临时重定向时需要用到Location字段,Location字段是HTTP报头当中的一个属性信息,该字段表明了你所要重定向到的目标网站。我们这里要演示临时重定向,可以将HTTP响应当中的状态码改为302,然后跟上对应的状态码描述,此外,还需要在HTTP响应报头当中添加Location字段,这个Location后面跟的就是你需要重定向到的网页,比如我们这里将其设置为qq的首页。代码如下class HttpResponse{public: HttpResponse() : _blankline(glinespace), _version("HTTP/1.0") { } void SetCode(int code) { _code = code; switch (_code) { case 200: _desc = "OK"; break; case 404: _desc = "Not Found"; break; case 302: _desc = "See Other"; break; default: break; } } void SetHeader(const std::string &key, const std::string &value) { auto iter = _headers.find(key); if (iter != _headers.end()) return; _headers.insert(std::make_pair(key, value)); } bool MakeResponse() { if (_targetfile == "./wwwroot/redir_test") { SetCode(302); SetHeader("Location", "https://www.qq.com/"); return true; } bool res = Util::ReadFileContent(_targetfile, &_text); // 浏览器请求的资源,一定会存在吗?出错呢? if (!res) { SetCode(404); _targetfile = webroot + page_404; Util::ReadFileContent(_targetfile, &_text); } SetCode(200); return true; } ~HttpResponse() {} public: std::string _version; int _code; // 404 std::string _desc; // "Not Found" std::unordered_map<std::string, std::string> _headers; std::string _blankline; std::string _text; // 其他属性 std::string _targetfile;};在浏览器输入106.54.48.112:8080/redir_test就会自动跳转到qq的首页 上述操作中是浏览器的底层根据Location自己定位网址的。HTTP常见的HeaderHTTP常见的Header如下:Content-Type:数据类型(text/html等)。Content-Length:正文的长度。Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上。User-Agent:声明用户的操作系统和浏览器的版本信息。Referer:当前页面是哪个页面跳转过来的。Location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问。Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/jingfeng514/article/details/151315040
-
初次接触华为设备接入服务(IoTDA),尝试了一下通过物联网管理平台实现终端的软件升级,我设计的是使用MQTT协议接入平台,但在控制台找了一圈,都没能找到如何把升级过程设置为PCP协议模式,控制台默认就是使用https方式传输软件文件(平台会先发一个version_queryl请求当前版本)。可是,我的设备是MCU方案,资源不够,无法使用https。 翻查文档,原文是“设备的OTA软件升级是基于华为定义的PCP协议进行的”,估计文档是旧文档,与实际情况不符了。所以,我求助专家,像这种使用MCU方案,MQTT方式接入,但又想使用占资源少的PCP协议实现OTA升级,要怎么操作?
-
如图所示,我是直接从设备影子那里直接复制的代码,不知道是什么问题
-
HTTPS 的优点HTTPS能够取代HTTP,主要是因为HTTPS在HTTP的基础上增加了安全性,提供了更加安全的数据传输方式。以下是HTTPS相较于HTTP的主要优势:数据安全性:HTTPS使用加密算法(如SSL/TLS)对传输的数据进行加密,保护数据在传输过程中不被窃取和篡改。这一特点使得HTTPS在数据安全性上大大优于HTTP,因为HTTP的数据传输是明文的,容易被黑客截获和篡改。身份认证:HTTPS通过证书验证服务器身份,确保用户与正规服务器建立连接,防止恶意伪造网站。这种身份认证机制有效避免了钓鱼网站和假冒网站的出现,增加了网络使用的安全性。完整性保护:HTTPS使用数字签名来检测数据是否被篡改,保证数据的完整性。即使数据在传输过程中被截获,攻击者也无法篡改数据而不被检测到。更高的搜索引擎排名:搜索引擎更倾向于显示使用HTTPS的网站,因为HTTPS提供更安全和可信的用户体验。这有助于提升网站的可见性和信誉。关于发送同样的网页数据量,HTTPS相较于HTTP会增加一定的数据量,因为HTTPS需要传输额外的加密和验证信息。然而,这种增加通常很小,一般不会对网络性能造成显著影响。具体的增加量取决于使用的加密算法和密钥长度等因素,但通常不会超过原始数据量的几个百分点。HTTPS证书不可信任可能的原因至于有些网址会提示证书不可信任,这通常是由以下几个原因造成的:证书已过期:网站的SSL/TLS证书有一个有效期限,如果证书已过期,浏览器将不再信任该证书。证书颁发机构不受信任:浏览器内置了一份受信任的证书颁发机构列表,如果网站的证书是由一个不在此列表中的机构颁发的,浏览器将不信任该证书。证书链不完整:SSL/TLS证书通常包含一个证书链,用于证明证书的有效性。如果证书链中的某个环节缺失或损坏,浏览器将无法验证证书的有效性。域名不匹配:如果证书中的域名与实际访问的域名不匹配,浏览器将认为证书无效。在解决证书不可信任的问题时,网站管理员应该检查证书的有效期、颁发机构、证书链和域名等信息,确保所有信息都正确无误。同时,用户也可以尝试更新浏览器或操作系统,以获取最新的受信任证书颁发机构列表。
-
一、Gworg申请SSL证书,国内网站一般用DV单域名。淘宝申请地址:cid:link_1图文教程:https://www.gworg.com/ssl/1384.html提交域名,付款后,很快就会收到解析说明二、登录华为云——云解析(如果域名在其它地方注册的,请进入对应的提供商地方管理域名)三、添加记录集页面快速访问地址(红色区域改成自己的域名就可以进入面板)https://console.huaweicloud.com/dns/?region=cn-north-4#/dns/publicRset?zoneid=8aace3b97c27b313017c91699c3f16ea&zonename=gworg.com.&zoneStatus=ACTIVE解析特别注意有特殊符号,值:"c31a75070bbd54c8a44593b9914c4a27fa0d891a63f4aea799ca07f709d4db8e"大约等待1-15分钟就可以拿到SSL证书,进入邮箱下载证书。四、配置云速建站1、邮件证书解压后选择:Nginx文件夹2、选择:后台管理选3、择绑定域名4、添加SSL证书注意:续费或更新SSL证书,可以点击删除证书或者点击更新证书后配置。5、选择对应的文件,右击打开方式将代码全部复制到对应的框内。1_gworg.com_bundle.crt(证书内容,包括中间证书)2_gworg.com.key(key内容)6、代码复制到对应框内,点击:确定。如果存在其它域名也相同操作。7、最后点击:确定生效时间:华为云云速建站配置完毕后,至少等待30分钟后生效,访问者需要清空浏览器记录访问。
-
PC根据文档可以下载根据文档这里格式不知道有没有错,下面第一个红色框是请求红色是发送的,绿色是接收,不明白400错误那里怎么解决,我用的ESP8266透传,已经接上了https 443接口
yd_247833416
发表于2024-03-11 23:57:58
2024-03-11 23:57:58
最后回复
yd_237139617
2025-03-17 09:32:19
223 10 -
一、短链接的起源短链接是一种将长URL转换为短、简洁的网址的技术。它的起源可以追溯到互联网发展的早期,当时长URL的使用给用户带来了繁琐和不便。为了解决这个问题,短链接技术应运而生。短链接 | 一个覆盖广泛主题工具的高效在线平台(amd794.com)cid:link_0二、短链接解决了什么问题短链接的主要目的是解决长URL带来的繁琐和不便。长URL不仅难以记忆和分享,而且在某些场景下可能会被截断或破坏。短链接通过将长URL转换为短、简洁的网址,使得用户可以更方便地分享和访问链接。三、短链接对现在的影响和作用链接分享:短链接在社交媒体和移动设备上的广泛应用,使得用户可以更轻松地分享链接。短链接不仅节省了字符空间,还可以提高链接的可读性和美观性。链接跟踪:短链接技术还可以用于链接跟踪和分析。通过在短链接中添加跟踪参数,可以追踪链接的点击量、来源和转化率等数据,为营销和分析提供有价值的信息。链接管理:短链接可以简化链接管理的流程。通过使用短链接服务,用户可以轻松地创建、编辑和管理大量的链接,提高链接管理的效率和便利性。链接安全:短链接技术可以提高链接的安全性。短链接服务通常会提供链接验证和防止恶意链接的功能,保护用户免受恶意网站和钓鱼攻击的威胁。四、短链接的应用领域社交媒体:短链接在社交媒体平台上被广泛应用,方便用户分享和点击链接,同时提供链接跟踪和分析的功能。移动应用:短链接在移动应用中用于分享和打开链接,可以提高用户体验和链接的可用性。营销活动:短链接在营销活动中起到重要作用,可以追踪链接的点击量和转化率,帮助营销人员评估活动效果。链接管理工具:短链接服务可以用于链接管理工具,帮助用户创建、编辑和管理大量的链接。五、总结短链接技术的诞生解决了长URL带来的繁琐和不便,对互联网用户的链接分享和访问带来了便利。短链接在社交媒体、移动应用、营销活动和链接管理等方面发挥着重要作用。同时,短链接技术还提供了链接跟踪和分析的功能,帮助用户评估链接的效果和营销活动的效果。随着互联网的发展,短链接技术仍然在不断创新和发展,为用户提供更便捷、安全和高效的链接管理和分享体验。转载自https://www.cnblogs.com/Amd794/p/18034385
-
【问题来源】黑龙江农信社【问题简要】在客户云系统的报表模块里,查看的数据与手册中大屏监控接口返回数据不一致【问题类别】座席监控【AICC解决方案版本】AICC 版本:AICC 8.0.71【问题现象描述】如:通过手册中 获取座席维度的历史监控指标接口:rest/cmsapp/v1/openapi/hisindex/agent查询接通率 与 客户云系统中的接通率有差异
-
【问题来源】黑龙江农信社【问题简要】使用 AICC 22.200.0 产品文档 (OP独立部署) 01.chm 中的java 鉴权示例代码无法进行鉴权,response 响应码 401【问题类别】座席监控【AICC解决方案版本】AICC 版本:AICC 8.0.71【问题现象描述】根据文档中 鉴权的示例代码生成了 authorization 串在执行示例代码的 doPost 方法后,返回401 鉴权失败但将 authorization 粘贴到 postman 执行 就可以返回 200 成功示例代码 原封粘贴出来,并未做逻辑变动java版本是 1.8_381
-
##1:现状目前参照手册《roma20.0.0.spc13产品文档.chm》ROMA证书视图--章节,已获取到如下3个文件:roma_protected_api_server.cert、roma_protected_api_server.key、roma_protected_api_server.trustcert参照其他业务系统从项目路径中拿到,api_client1_IP.cert.pem、api_client1_IP.cert.pem##2:需求用api_client1_IP.cert.pem、api_client1_IP.cert.pem 转 JKS文件,希望通过org.springframework.web.client RestTemplate方式可以访问通https 7000的1.0和2.0 ROMA接口。##3:问题A:客户端服务器是否需要使用 roma服务端的 roma_protected_api_server.cert、roma_protected_api_server.key、roma_protected_api_server.trustcert文件生成客户端使用的 XXXcert.pem和XXXkey.pem文件B:pem文件是否需要转为 JKS文件 给java代码以 RestTemplate使用?
-
【问题来源】 浙江省公安厅【问题类别】 CMS failbak目录小文件过多【AICC解决方案版本】 22.200【问题现象描述】 df -i| grep -v tmpfs | grep -v shm | grep -v udev 发现CMS的 /ctibill/outpush/-1/dcsjob/failbak 如下小文件过多,3天会生成50多万条,df -i占用接近80%,请问这个怎么产生的?怎么关闭? Prm_xxxx.txt oplist_xxxx.txt AgentSkilInfor_xxxx.txt【日志或错误截图】
-
【问题来源】 浙江110【问题简要】 实时质检里质检席插入某个工号后,不取消插入就会一直插入所有话务,是否有只插入单通话务的设计,不对下通话务生效。目前就是全程插入的设计么。监听是否也是全程监听。【问题类别】 CTI平台提供的cc-gateway接口【AICC解决方案版本】 AICC 22.200 ,浙江110版本4月9日整体升级过
-
【问题来源】 浙江110【问题简要】目前存在未操作话机和gateway平台接口时,话机也未被重复登录情况下,收到PhoneBusy后被自动置忙,部分话机比较频繁,需要降低误报频率【问题类别】 CTI平台提供的cc-gateway接口【AICC解决方案版本】 AICC 22.200 ,浙江110版本4月9日整体升级过
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签