, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
Loading...
Loading...
{
"latency": 681,
"ipAddresses": [
"michaelliao.github.io.",
"185.199.108.153",
"185.199.109.153",
"185.199.110.153",
"185.199.111.153",
"michaelliao.github.io.",
"2606:50c0:8000::153",
"2606:50c0:8001::153",
"2606:50c0:8002::153",
"2606:50c0:8003::153"
],
"dns": {
"NS": [
"f1g1ns2.dnspod.net.",
"f1g1ns1.dnspod.net."
],
"A": [
"michaelliao.github.io.",
"185.199.108.153",
"185.199.109.153",
"185.199.110.153",
"185.199.111.153"
],
"AAAA": [
"michaelliao.github.io.",
"2606:50c0:8000::153",
"2606:50c0:8001::153",
"2606:50c0:8002::153",
"2606:50c0:8003::153"
],
"CNAME": [
"michaelliao.github.io."
],
"TXT": [
"ichaelliao.github.io"
]
}
}
[
{
"url": "https://liaoxuefeng.com",
"technologies": [
{
"slug": "element-ui",
"name": "Element UI",
"versions": [],
"trafficRank": 20,
"confirmedAt": 1724641713,
"icon": "ElementUI.svg",
"categories": [
{
"id": 66,
"slug": "ui-frameworks",
"name": "UI frameworks"
}
]
},
{
"slug": "http-2",
"name": "HTTP/2",
"versions": [],
"trafficRank": 20,
"confirmedAt": 1721618440,
"icon": "HTTP2.svg",
"categories": [
{
"id": 19,
"slug": "miscellaneous",
"name": "Miscellaneous"
}
]
},
{
"slug": "google-tag-manager",
"name": "Google Tag Manager",
"versions": [],
"trafficRank": 27,
"confirmedAt": 1719190885,
"icon": "Google Tag Manager.svg",
"categories": [
{
"id": 42,
"slug": "tag-managers",
"name": "Tag managers"
}
]
},
{
"slug": "amp",
"name": "AMP",
"versions": [],
"trafficRank": 27,
"confirmedAt": 1719190885,
"icon": "Accelerated-Mobile-Pages.svg",
"categories": [
{
"id": 12,
"slug": "javascript-frameworks",
"name": "JavaScript frameworks"
}
]
},
{
"slug": "google-analytics",
"name": "Google Analytics",
"versions": [],
"trafficRank": 27,
"confirmedAt": 1719190885,
"icon": "Google Analytics.svg",
"categories": [
{
"id": 10,
"slug": "analytics",
"name": "Analytics"
}
]
},
{
"slug": "redux",
"name": "Redux",
"versions": [],
"trafficRank": 70,
"confirmedAt": 1724212039,
"icon": "Redux.svg",
"categories": [
{
"id": 12,
"slug": "javascript-frameworks",
"name": "JavaScript frameworks"
}
]
},
{
"slug": "gravatar",
"name": "Gravatar",
"versions": [],
"trafficRank": 43,
"confirmedAt": 1723792560,
"icon": "Gravatar.svg",
"categories": [
{
"id": 19,
"slug": "miscellaneous",
"name": "Miscellaneous"
}
]
},
{
"slug": "nginx",
"name": "Nginx",
"cpe": "cpe:2.3:a:f5:nginx:1.18.0:*:*:*:*:*:*:*",
"versions": [
"1.18.0"
],
"trafficRank": 53,
"confirmedAt": 1723792561,
"icon": "Nginx.svg",
"categories": [
{
"id": 22,
"slug": "web-servers",
"name": "Web servers"
},
{
"id": 64,
"slug": "reverse-proxies",
"name": "Reverse proxies"
}
]
},
{
"slug": "ubuntu",
"name": "Ubuntu",
"versions": [],
"trafficRank": 53,
"confirmedAt": 1723792561,
"icon": "Ubuntu.svg",
"categories": [
{
"id": 28,
"slug": "operating-systems",
"name": "Operating systems"
}
]
},
{
"slug": "fastly",
"name": "Fastly",
"versions": [],
"trafficRank": 58,
"confirmedAt": 1724780473,
"icon": "Fastly.svg",
"categories": [
{
"id": 31,
"slug": "cdn",
"name": "CDN"
}
]
},
{
"slug": "varnish",
"name": "Varnish",
"versions": [],
"trafficRank": 58,
"confirmedAt": 1724780473,
"icon": "Varnish.svg",
"categories": [
{
"id": 23,
"slug": "caching",
"name": "Caching"
}
]
},
{
"slug": "github-pages",
"name": "GitHub Pages",
"versions": [],
"trafficRank": 58,
"confirmedAt": 1724780473,
"icon": "GitHub.svg",
"categories": [
{
"id": 62,
"slug": "paas",
"name": "PaaS"
}
]
},
{
"slug": "google-adsense",
"name": "Google AdSense",
"versions": [],
"trafficRank": 76,
"confirmedAt": 1719190885,
"icon": "Google AdSense.svg",
"categories": [
{
"id": 36,
"slug": "advertising",
"name": "Advertising"
}
]
},
{
"slug": "highlight-js",
"name": "Highlight.js",
"versions": [],
"trafficRank": 198,
"confirmedAt": 1722221389,
"icon": "Highlight.js.svg",
"categories": [
{
"id": 59,
"slug": "javascript-libraries",
"name": "JavaScript libraries"
}
]
},
{
"slug": "uikit",
"name": "UIKit",
"versions": [],
"trafficRank": 202,
"confirmedAt": 1722221389,
"icon": "UIKit.svg",
"categories": [
{
"id": 66,
"slug": "ui-frameworks",
"name": "UI frameworks"
}
]
},
{
"slug": "moment-js",
"name": "Moment.js",
"cpe": "cpe:2.3:a:momentjs:moment:2.29.1:*:*:*:*:*:*:*",
"versions": [
"2.29.1"
],
"trafficRank": 198,
"confirmedAt": 1722221389,
"icon": "Moment.js.svg",
"categories": [
{
"id": 59,
"slug": "javascript-libraries",
"name": "JavaScript libraries"
}
]
},
{
"slug": "jquery",
"name": "jQuery",
"cpe": "cpe:2.3:a:jquery:jquery:2.1.4:*:*:*:*:*:*:*",
"versions": [
"2.1.4"
],
"trafficRank": 198,
"confirmedAt": 1722221389,
"icon": "jQuery.svg",
"categories": [
{
"id": 59,
"slug": "javascript-libraries",
"name": "JavaScript libraries"
}
]
},
{
"slug": "marked",
"name": "Marked",
"versions": [],
"trafficRank": 198,
"confirmedAt": 1722221389,
"icon": "Marked.svg",
"categories": [
{
"id": 59,
"slug": "javascript-libraries",
"name": "JavaScript libraries"
}
]
},
{
"slug": "codemirror",
"name": "CodeMirror",
"versions": [
"5.13.3"
],
"trafficRank": 198,
"confirmedAt": 1722221389,
"icon": "CodeMirror.svg",
"categories": [
{
"id": 20,
"slug": "editors",
"name": "Editors"
}
]
},
{
"slug": "vue-js",
"name": "Vue.js",
"versions": [
"2.6.10"
],
"trafficRank": 263,
"confirmedAt": 1724641713,
"icon": "vue.svg",
"categories": [
{
"id": 12,
"slug": "javascript-frameworks",
"name": "JavaScript frameworks"
}
]
},
{
"slug": "open-graph",
"name": "Open Graph",
"versions": [],
"trafficRank": 198,
"confirmedAt": 1722221388,
"icon": "Open Graph.svg",
"categories": [
{
"id": 19,
"slug": "miscellaneous",
"name": "Miscellaneous"
}
]
},
{
"slug": "ethers",
"name": "Ethers",
"versions": [],
"trafficRank": 198,
"confirmedAt": 1722221388,
"icon": "Ethers.svg",
"categories": [
{
"id": 59,
"slug": "javascript-libraries",
"name": "JavaScript libraries"
}
]
},
{
"slug": "jsdelivr",
"name": "jsDelivr",
"versions": [],
"trafficRank": 182,
"confirmedAt": 1724251979,
"icon": "jsdelivr-icon.svg",
"categories": [
{
"id": 31,
"slug": "cdn",
"name": "CDN"
}
]
},
{
"slug": "cart-functionality",
"name": "Cart Functionality",
"versions": [],
"trafficRank": 390,
"confirmedAt": 1724813483,
"icon": "Cart-generic.svg",
"categories": [
{
"id": 6,
"slug": "ecommerce",
"name": "Ecommerce"
}
]
},
{
"slug": "cloudflare",
"name": "Cloudflare",
"versions": [],
"trafficRank": 443,
"confirmedAt": 1724251979,
"icon": "CloudFlare.svg",
"categories": [
{
"id": 31,
"slug": "cdn",
"name": "CDN"
}
]
},
{
"slug": "http-3",
"name": "HTTP/3",
"versions": [],
"trafficRank": 443,
"confirmedAt": 1724251979,
"icon": "HTTP3.svg",
"categories": [
{
"id": 19,
"slug": "miscellaneous",
"name": "Miscellaneous"
}
]
},
{
"slug": "katex",
"name": "KaTeX",
"versions": [
"0.15.1"
],
"trafficRank": 958,
"confirmedAt": 1724825431,
"icon": "KaTeX.svg",
"categories": [
{
"id": 25,
"slug": "javascript-graphics",
"name": "JavaScript graphics"
}
]
},
{
"slug": "tailwind-css",
"name": "Tailwind CSS",
"versions": [],
"trafficRank": 696,
"confirmedAt": 1724825431,
"icon": "tailwindcss.svg",
"categories": [
{
"id": 66,
"slug": "ui-frameworks",
"name": "UI frameworks"
}
]
},
{
"slug": "baidu-analytics",
"name": "Baidu Analytics (百度统计)",
"versions": [],
"trafficRank": 981,
"confirmedAt": 1724825431,
"icon": "Baidu Tongji.png",
"categories": [
{
"id": 10,
"slug": "analytics",
"name": "Analytics"
}
]
}
]
}
]
{
"data": {
"total": 0,
"personal_emails": 0,
"generic_emails": 0,
"department": {
"executive": 0,
"it": 0,
"finance": 0,
"management": 0,
"sales": 0,
"legal": 0,
"support": 0,
"hr": 0,
"marketing": 0,
"communication": 0,
"education": 0,
"design": 0,
"health": 0,
"operations": 0
},
"seniority": {
"junior": 0,
"senior": 0,
"executive": 0
}
},
"meta": {
"params": {
"domain": "liaoxuefeng.com",
"company": null,
"type": null
}
}
}
{
"Baidu Analytics": "Analytics tracking pixel from Chinese language search engine Baidu.",
"Fastly": "Real-time Analytics and CDN platform. Analyze your web and server traffic patterns in real-time.",
"CrUX Dataset": "CrUX is a data collection system that gathers information about how real users interact with websites. This website is included in the user experiences data gathered from Google Chrome and thus considered sufficiently popular on the Internet.",
"CrUX Top 1m": "Relative measure of site popularity within the CrUX dataset, measured by the total number of navigations on the origin. This site is in the top 1 million.",
"Cloudflare Radar": "The website appears on the Cloudflare Radar Top 1m sites list",
"Cloudflare Radar Top 500k": "The website appears in the Cloudflare Radar Top 500,000.",
"Chinese": "Website content is written in Chinese variants including Mandarin, Gan, Hakka, Yue Cantonese and Xiang Chinese. Based on HTML langauge attributes on the website",
"Mandarin Chinese - Inferred": "Based on the title and description text the website content is potentially Mandarin Chinese.",
"Viewport Meta": "This page uses the viewport meta tag which means the content may be optimized for mobile content.",
"IPhone / Mobile Compatible": "The website contains code that allows the page to support IPhone / Mobile Content.",
"KaTeX": "Math typesetting library for the web.",
"GitHub": "The website mentions github.com in some form.",
"SSL by Default": "The website redirects traffic to an HTTPS/SSL version by default.",
"TrustAsia": "SSL certificate provider from China.",
"LetsEncrypt": "Let’s Encrypt is a free open Certificate Authority.",
"Alibaba": "Chinese based trading site.",
"Chinese Server Location": "The web server is located in China.",
"Fastly Hosted": "Hosted at Fastly",
"Fastly Load Balancer": "Hosted on Fastly's Load Balancing system.",
"U.S. Server Location": "The web server is located in the United States.",
"China Telecom": "State owned telecom web hosting provider in China.",
"ChinaNet": "Hosting provider from China.",
"DNSSEC": "DNSSEC strengthens DNS authentication by using digital signatures based on public key cryptography.",
"DMARC": "A technical specification created by a group of organizations that want to help reduce the potential for email-based abuse",
"DMARC Reject": "The domain has a DMARC policy of 'Reject'. This policy tells the mail server to reject emails that fail DMARC checks, preventing them from being delivered at all.",
"nginx": "nginx [engine x] is a HTTP server and mail proxy server written by Igor Sysoev.",
"Varnish": "Varnish is a web accelerator / reverse proxy caching server.",
"Citrix NetScaler": "Citrix NetScaler is a Web application delivery appliance.",
"Tengine": "Tengine is a web server developed by the Servers Platform Team at Taobao. Based on nginx.",
"Ubuntu": "Ubuntu is a free, Debian derived Linux-based operating system, available with both community and professional support.",
"GitHub Hosting": "This site is hosted on Github infrastructure.",
"IPv6": "The website has an IPv6 record.",
"Alibaba Cloud CDN": "Alibaba Cloud CDN is a virtual network that consists of globally distributed edge nodes, and can retrieve resources from the nearest edge nodes instead of origin servers.",
"Alibaba Cloud Object Storage Service": "Alibaba Cloud Object Storage Service (OSS) is a secure, cost-effective and high-performance cloud storage solution for storing, backing up, and archiving large amounts of data."
}
<!doctype html>
<html lang="zh-CN">
<!--
-->
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="廖雪峰的官方网站 (liaoxuefeng.com) 研究互联网产品和技术,提供原创中文精品教程" />
<meta name="keywords" content="廖雪峰, liaoxuefeng, git, gitsite, javascript, node, jquery, python, java, spring, sql, database, linux, operating system, os, cpu, verilog, risc-v, bitcoin, ethereum, ai, 教程, 软件, 编程, 开发, 运维, 云计算, 网络, 互联网, 比特币, 以太坊, 操作系统, 智能合约, 数字货币" />
<!-- request path: /404 -->
<title>
Not Found - 廖雪峰的官方网站
</title>
<!-- baidu analytics -->
<script>
var _hmt = _hmt || [];
</script>
<script async src="https://hm.baidu.com/hm.js?2efddd14a5f2b304677462d06fb4f964"></script>
<!--// baidu analytics -->
<script>
// global status:
window.gs_status = {
};
</script>
<link rel="stylesheet" href="/static/highlight.css">
<link rel="stylesheet" href="/static/[email protected]/dist/katex.min.css">
<style>
@font-face {
font-family: "JetBrainsMono";
src: url("/static/[email protected]/fonts/webfonts/JetBrainsMono-Regular.woff2");
}
</style>
<!-- css generated by post-build.mjs -->
<link rel="stylesheet" href="/static/default-tailwind.css">
<link rel="stylesheet" href="/static/custom.css">
<script>
window.gitsite = {
isDarkMode: function () {
let colorScheme = localStorage.getItem('color-scheme');
if (colorScheme !== null) {
return colorScheme === 'dark';
}
// detect system dark mode:
return window.matchMedia !== undefined && window.matchMedia('(prefers-color-scheme: dark)').matches;
},
setDarkMode: function (isDark) {
console.log(`set color scheme: ${isDark ? 'dark' : 'light'}`);
localStorage.setItem('color-scheme', isDark ? 'dark' : 'light');
if (isDark) {
document.documentElement.classList.add('dark');
document.documentElement.classList.remove('light');
} else {
document.documentElement.classList.add('light');
document.documentElement.classList.remove('dark');
}
},
encodeHtml: function (s) {
return s.replaceAll(/\&/g, '&').replaceAll(/\</g, '<').replaceAll(/\>/g, '>');
},
loadScript: function (url, onloaded, isAsync) {
if (window._loaded_js_ === undefined) {
window._loaded_js_ = {};
}
if (!window._loaded_js_[url]) {
console.log(`load script: ${url}`);
let e = document.createElement('script');
e.src = url;
e.type = 'text/javascript';
if (onloaded) {
e.addEventListener('load', onloaded);
}
if (isAsync) {
e.async = true;
}
document.getElementsByTagName('head')[0].appendChild(e);
window._loaded_js_[url] = true;
} else {
// script already loaded:
onloaded && onloaded();
}
},
addContentChangedListener: function (callback) {
if (window.gitsite._contentChangedListeners === undefined) {
window.gitsite._contentChangedListeners = [];
}
window.gitsite._contentChangedListeners.push(callback);
},
triggerContentChangedListener: function () {
if (window.gitsite._contentChangedListeners) {
for (let listener of window.gitsite._contentChangedListeners) {
try {
listener();
} catch (err) {
console.error(`error when trigger content changed listener: ${listener}`);
}
}
}
},
setInnerHTML: function (dom, html) {
dom.innerHTML = html;
Array.from(dom.querySelectorAll('script'))
.forEach(oldScriptEl => {
const newScriptEl = document.createElement('script');
Array.from(oldScriptEl.attributes).forEach(attr => {
newScriptEl.setAttribute(attr.name, attr.value);
});
const scriptText = document.createTextNode(oldScriptEl.innerHTML);
newScriptEl.appendChild(scriptText);
oldScriptEl.parentNode.replaceChild(newScriptEl, oldScriptEl);
});
},
getOuterWidth: function (dom) {
const s = window.getComputedStyle(dom);
const t = parseFloat(s.width) + parseFloat(s.marginLeft) + parseFloat(s.marginRight);
return isNaN(t) ? 0 : Math.ceil(t);
},
showSearch: function () {
document.getElementById('gsi-search').classList.remove('hidden');
document.getElementById('gsi-search-input').focus();
},
hideSearch: function () {
document.getElementById('gsi-search').classList.add('hidden');
},
showOffcanvas: function () {
document.getElementById('gsi-offcanvas').classList.remove('hidden');
let indexDom = document.getElementById('gsi-index');
document.getElementById('gsi-offcanvas-index').prepend(indexDom);
window.gs_status.show_offcanvas = true;
const popup = document.getElementById('gsi-offcanvas-popup');
if (popup.animate) {
popup.animate([{ left: "0px" }], 200).onfinish = () => popup.classList.add('gsc-offcanvas-popup-show');
} else {
// animation not supported:
popup.classList.add('gsc-offcanvas-popup-show');
}
},
hideOffcanvas: function () {
document.getElementById('gsi-offcanvas').classList.add('hidden');
document.getElementById('gsi-offcanvas-popup').classList.remove('gsc-offcanvas-popup-show');
let indexDom = document.getElementById('gsi-index');
document.getElementById('gsi-sidebar').prepend(indexDom);
window.gs_status.show_offcanvas = false;
},
initPopupMenu: function (dom) {
const popup = dom.nextElementSibling;
if (popup && popup.classList.contains('gsc-popup-menu-container')) {
console.log('init popup menu: ' + dom);
popup.tabIndex = 0;
dom.addEventListener('mouseenter', function () {
popup.classList.remove('hidden');
popup.__focus = false;
});
dom.addEventListener('mouseleave', function () {
setTimeout(function () {
if (!popup.__focus) {
popup.classList.add('hidden');
}
}, 250);
});
dom.addEventListener('click', (e) => {
if (popup.__focus) {
popup.classList.add('hidden');
popup.__focus = false;
} else {
popup.classList.remove('hidden');
popup.__focus = true;
popup.focus();
}
});
popup.addEventListener('mouseenter', (e) => {
popup.__focus = true;
});
popup.addEventListener('mouseleave', (e) => {
popup.classList.add('hidden');
popup.__focus = false;
});
popup.addEventListener('focusout', (e) => {
popup.classList.add('hidden');
popup.__focus = false;
})
} else {
console.warn('cannot init popup menu: ' + dom);
}
}
};
// set dark mode immediately:
(function () {
gitsite.setDarkMode(gitsite.isDarkMode());
})();
// equivalent of $(document).ready(fn):
function documentReady(fn) {
if (document.readyState === 'complete' || document.readyState === 'interactive') {
setTimeout(fn, 0);
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
documentReady(() => {
console.log('auto select nav menu...');
const gs_path_prefix = (p) => {
if (p.endsWith('/index.html')) {
return p.substring(0, p.length - 10);
}
return p;
}
const urlPathPrefix = gs_path_prefix(location.href);
document.querySelectorAll('nav.gsc-nav li.gsc-nav-li a').forEach(a => {
if (urlPathPrefix.startsWith(gs_path_prefix(a.href))) {
a.classList.add('gsc-active');
}
});
});
documentReady(() => {
console.log('init popup menu...');
const doms = document.querySelectorAll('.gsc-popup-menu');
for (let dom of doms) {
gitsite.initPopupMenu(dom);
}
});
documentReady(() => {
console.log('init auto resize nav bar...');
const resizeNavigationMenu = () => {
if (!window.matchMedia("(min-width: 768px)").matches) {
return;
}
const
containerWidth = document.querySelector('#gsi-header div.gsc-container').offsetWidth,
menuMore = document.querySelector('#gsi-nav-menu-more'),
navRightWidth = document.getElementById('gsi-header-nav-right').offsetWidth;
let info = window.__nav_resize;
if (!info) {
const
menuItems = document.querySelectorAll('#gsi-nav-menu>li.gsc-nav-li'),
widthOfItems = [];
menuItems.forEach((dom) => {
widthOfItems.push(gitsite.getOuterWidth(dom));
});
info = {
menuItems: menuItems,
moreItems: document.querySelectorAll('#gsi-nav-menu-more div.gsc-popup-menu-container ul>li'),
widthOfLogo: gitsite.getOuterWidth(document.querySelector('#gsi-nav-menu li.gsc-nav-logo')),
widthOfMore: gitsite.getOuterWidth(document.querySelector('#gsi-nav-menu li#gsi-nav-menu-more')),
widthOfItems: widthOfItems,
totalWidthOfItems: widthOfItems.reduce((s, x) => s + x, 0)
};
window.__nav_resize = info;
console.log(`calculate resize info: ${JSON.stringify(info)}`);
}
console.log(`resize: container=${containerWidth}, items=${info.totalWidthOfItems}, right=${navRightWidth}`);
// resize:
menuMore.classList.add('invisible');
let widthLeft = containerWidth - navRightWidth - info.widthOfLogo - info.widthOfMore - 30;
let showMore = false;
for (let i = 0; i < info.widthOfItems.length; i++) {
if (showMore) {
info.menuItems[i].style.display = 'none';
info.moreItems[i].style.display = '';
} else {
let w = info.widthOfItems[i];
if (widthLeft >= w) {
info.menuItems[i].style.display = '';
info.moreItems[i].style.display = 'none';
widthLeft -= w;
} else {
showMore = true;
menuMore.classList.remove('invisible');
info.menuItems[i].style.display = 'none';
info.moreItems[i].style.display = '';
}
}
}
};
window.addEventListener('resize', resizeNavigationMenu);
window.addEventListener('orientationchange', resizeNavigationMenu);
resizeNavigationMenu();
});
</script>
<script src="/static/[email protected]/dist/abcjs-basic-min.js"></script>
<script src="/static/abcjs-init.js"></script>
<script src="/static/custom.js"></script>
</head>
<body class="gsc-text gsc-bg">
<div id="gsi-header" class="gsc-bg border-b gsc-border">
<div class="gsc-container">
<div id="gsi-header-nav" class="relative flex items-center">
<div id="gsi-header-nav-main" class="relative flex items-center mr-auto">
<nav class="gsc-nav gsc-nav-main">
<!-- nav for small device -->
<ul id="gsi-nav-menu-small" class="max-md:flex md:hidden">
<!-- logo -->
<li class="mr-4 list-item">
<a href="/" class="inline-block py-4">
<img src="/static/logo.svg" class="inline-block max-w-none h-6">
</a>
</li>
<!--// logo -->
<!-- nav menu -->
<li class="mr-4 list-item relative">
<a class="gsc-popup-menu inline-block py-4" href="#0">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" class="inline-block w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M19.5 8.25l-7.5 7.5-7.5-7.5" />
</svg>
</a>
<div class="gsc-popup-menu-container hidden left-0">
<ul>
<li class="block">
<a href="/books/java/index.html"
>Java教程</a>
</li>
<li class="block">
<a href="/books/python/index.html"
>Python教程</a>
</li>
<li class="block">
<a href="/books/javascript/index.html"
>JavaScript教程</a>
</li>
<li class="block">
<a href="/books/sql/index.html"
>SQL教程</a>
</li>
<li class="block">
<a href="/books/summerframework/index.html"
>手写Spring</a>
</li>
<li class="block">
<a href="/books/jerrymouse/index.html"
>手写Tomcat</a>
</li>
<li class="block">
<a href="/books/blockchain/index.html"
>区块链教程</a>
</li>
<li class="block">
<a href="/books/git/index.html"
>Git教程</a>
</li>
<li class="block">
<a href="/books/makefile/index.html"
>Makefile教程</a>
</li>
<li class="block">
<a href="/blogs/all/index.html"
>博客</a>
</li>
</ul>
</div>
</li>
<!--// nav menu -->
</ul>
<!--// nav for small device -->
<!-- nav for desktop -->
<ul id="gsi-nav-menu" class="max-md:hidden md:flex">
<!-- logo -->
<li class="gsc-nav-logo mr-4 list-item">
<a href="/" class="inline-block py-4">
<img src="/static/logo.svg" class="inline-block max-w-none h-6">
廖雪峰的官方网站
</a>
</li>
<!--// logo -->
<!-- nav menu -->
<li class="gsc-nav-li mr-4">
<a href="/books/java/index.html"
>Java教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/python/index.html"
>Python教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/javascript/index.html"
>JavaScript教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/sql/index.html"
>SQL教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/summerframework/index.html"
>手写Spring</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/jerrymouse/index.html"
>手写Tomcat</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/blockchain/index.html"
>区块链教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/git/index.html"
>Git教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/books/makefile/index.html"
>Makefile教程</a>
</li>
<li class="gsc-nav-li mr-4">
<a href="/blogs/all/index.html"
>博客</a>
</li>
<li id="gsi-nav-menu-more" class="relative mr-4 invisible"><!-- more menu -->
<a class="gsc-popup-menu inline-block py-4" href="#0">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" class="inline-block w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M19.5 8.25l-7.5 7.5-7.5-7.5" />
</svg>
</a>
<div class="gsc-popup-menu-container hidden right-0">
<ul>
<li class="block">
<a href="/books/java/index.html"
>Java教程</a>
</li>
<li class="block">
<a href="/books/python/index.html"
>Python教程</a>
</li>
<li class="block">
<a href="/books/javascript/index.html"
>JavaScript教程</a>
</li>
<li class="block">
<a href="/books/sql/index.html"
>SQL教程</a>
</li>
<li class="block">
<a href="/books/summerframework/index.html"
>手写Spring</a>
</li>
<li class="block">
<a href="/books/jerrymouse/index.html"
>手写Tomcat</a>
</li>
<li class="block">
<a href="/books/blockchain/index.html"
>区块链教程</a>
</li>
<li class="block">
<a href="/books/git/index.html"
>Git教程</a>
</li>
<li class="block">
<a href="/books/makefile/index.html"
>Makefile教程</a>
</li>
<li class="block">
<a href="/blogs/all/index.html"
>博客</a>
</li>
</ul>
</div>
</li><!--// more menu -->
<!--// nav menu -->
</ul>
<!--// nav for desktop -->
</nav>
</div>
<div id="gsi-header-nav-right" class="relative flex items-center">
<nav class="gsc-nav gsc-nav-right font-semibold">
<ul class="flex space-x-4">
<!-- search -->
<li><a class="inline-block py-4" href="#0" onclick="gitsite.showSearch();return false;">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" class="inline-block w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" />
</svg>
</a>
</li>
<!--// search -->
<!-- light mode -->
<li class="gsc-hidden-on-dark">
<a class="inline-block py-4" href="#0"
onclick="gitsite.setDarkMode(true);return false;">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" class="inline-block w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z" />
</svg>
</a>
</li>
<!--// light mode -->
<!-- dark mode -->
<li class="gsc-hidden-on-light">
<a class="inline-block py-4" href="#0"
onclick="gitsite.setDarkMode(false);return false;">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" class="inline-block w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z" />
</svg>
</a>
</li>
<!--// dark mode -->
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="gsi-body" class="w-full">
<div class="gsc-container">
<div id="gsi-content">
<div id="gsi-index-content">
<div style="text-align:center">
<h1>404 Not Found</h1>
<svg xmlns="http://www.w3.org/2000/svg" style="display:block;margin:auto;width:100%;max-width:640px" viewBox="0 0 320 120" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" fill="currentColor"><path d="M0,142h8v2h-8v-2Zm28,0h4v2h-4v-2Zm68,0h8v2h-8v-2ZM80,100h-4v14h-4v6h-4v4h-4v16h4v4h-8v-12h-4v-4h-4v4h-4v4h-4v4h4v4h-8v-16h-4v-4h-4v-4h-4v-4h-4v-4h-4v-24h4v8h4v4h4v4h8v-4h4v-4h6v-4h6v-4h4v-26h4v-4h32v4h4v18h-20v4h12v4h-16v8h8v8h-4v-4Zm2,40h2v2h-2v-2Zm-70-4h8v2h-8v-2Zm98-2h6v2h-6v-2Zm-206-6h128v2h-128v-2Zm168,0h152v2h-152v-2ZM68,64v4h4v-4h-4Z" transform="translate(96-35)"/></svg>
<h1>指定的页面不存在</h1>
</div>
</div>
</div>
<div id="gsi-footer">
<!-- footer -->
<div class="py-4 text-center">
<div>
©<a href="/">liaoxuefeng.com</a>
- <a href="https://weibo.com/liaoxuefeng" target="_blank">微博</a>
- <a href="https://github.com/michaelliao/liaoxuefeng.com" target="_blank">GitHub</a>
- <a href="/pages/license/index.html" target="_blank">License</a>
</div>
</div>
<!--// footer -->
</div>
</div>
</div>
<div id="gsi-offcanvas" onclick="gitsite.hideOffcanvas()" class="hidden gsc-backdrop">
<div id="gsi-offcanvas-popup" onclick="event.stopPropagation()" class="gsc-popup-container gsc-offcanvas-popup">
<div id="gsi-offcanvas-index"></div>
</div>
</div>
<div id="gsi-search" onclick="gitsite.hideSearch()"
class="hidden gsc-backdrop z-30 fixed top-0 left-0 right-0 bottom-0">
<div class="gsc-container">
<div onclick="event.stopPropagation()"
class="gsc-popup-container flex flex-col border shadow rounded-md fixed top-8 left-6 right-6 bottom-8 sd:top-12 sd:left-8 sd:right-8 sd:bottom-12 md:top-16 md:left-12 md:right-12 md:bottom-16">
<div class="flex-none p-4 sm:p-6 md:p-8 border-b border-slate-200 dark:border-slate-700">
<input id="gsi-search-input" type="text" class="block w-full"
placeholder="Type keywords to search...">
</div>
<div id="gsi-search-results" class="px-4 sm:px-6 md:px-8 flex-auto overflow-y-scroll">
<!--
<div>
<a href="uri">title</a>
<p>content</p>
</div>
-->
</div>
</div>
</div>
</div>
<script>
window.onsearchready = (searchFn) => {
// debug search on console:
window.__search__ = searchFn;
console.log('search ready.');
function delay(callback, ms = 500) {
let timer = 0;
return function () {
let context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
callback.apply(context, args);
}, ms);
};
}
function escapeHtml(unsafe) {
return unsafe.replaceAll('&', '&')
.replaceAll('<', '<')
.replaceAll('>', '>');
}
let input = document.getElementById('gsi-search-input');
let results = document.getElementById('gsi-search-results');
input.addEventListener('input', delay(function (e) {
let q = e.target.value.trim();
console.log(`start search: ${q}`);
if (q) {
let rs = searchFn(q);
console.log(rs.length + ' found.');
results.innerHTML = rs.map(r => {
return `<div><a href="${r.uri}">${escapeHtml(r.title)}</a><p>${escapeHtml(r.content)}</p></div>`;
}).join('\n');
} else {
results.innerHTML = '';
}
}, 500));
};
</script>
<script src="/static/[email protected]/dist/flexsearch.bundle.js"></script>
<script src="/static/search-index.js" defer></script>
</body>
</html>
{
"error": false,
"result": {
"success": true,
"ogTitle": "\n首页 - 廖雪峰的官方网站\n",
"ogDescription": "廖雪峰的官方网站 (liaoxuefeng.com) 研究互联网产品和技术,提供原创中文精品教程",
"ogLocale": "zh-CN",
"charset": "UTF-8",
"requestUrl": "https://liaoxuefeng.com"
},
"response": {}
}
{
"status": 200,
"statusText": "",
"headers": {
"accept-ranges": "bytes",
"access-control-allow-origin": "*",
"age": "383",
"cache-control": "max-age=600",
"connection": "keep-alive",
"content-encoding": "gzip",
"content-length": "6872",
"content-type": "text/html; charset=utf-8",
"date": "Sat, 01 Feb 2025 01:02:30 GMT",
"etag": "W/\"678c95d4-8a79\"",
"expires": "Sun, 19 Jan 2025 06:23:57 GMT",
"last-modified": "Sun, 19 Jan 2025 06:04:04 GMT",
"server": "GitHub.com",
"vary": "Accept-Encoding",
"via": "1.1 varnish",
"x-cache": "HIT",
"x-cache-hits": "1",
"x-fastly-request-id": "da758e6e4683692cbf21c8f55d0a0a41be9810d0",
"x-github-request-id": "7449:29290:27DE42A:2CFC49C:678C9824",
"x-proxy-cache": "MISS",
"x-served-by": "cache-iad-kiad7000175-IAD",
"x-timer": "S1738371751.846917,VS0,VE2"
}
}
{
"whois.verisign-grs.com": {
"Domain Status": [
"clientTransferProhibited https://icann.org/epp#clientTransferProhibited",
"clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited"
],
"Name Server": [
"F1G1NS1.DNSPOD.NET",
"F1G1NS2.DNSPOD.NET"
],
"Domain Name": "LIAOXUEFENG.COM",
"Registry Domain ID": "1540937167_DOMAIN_COM-VRSN",
"Registrar WHOIS Server": "grs-whois.hichina.com",
"Registrar URL": "http://wanwang.aliyun.com",
"Updated Date": "2024-08-13T12:58:45Z",
"Created Date": "2009-02-05T01:51:44Z",
"Expiry Date": "2027-02-05T01:51:44Z",
"Registrar": "Alibaba Cloud Computing Ltd. d/b/a HiChina (www.net.cn)",
"Registrar IANA ID": "1599",
"Registrar Abuse Contact Email": "[email protected]",
"Registrar Abuse Contact Phone": "+86.95187",
"DNSSEC": "unsigned",
"URL of the ICANN Whois Inaccuracy Complaint Form": "https://www.icann.org/wicf/",
">>> Last update of whois database": "2025-02-01T01:02:20Z <<<",
"text": [
"For more information on Whois status codes, please visit https://icann.org/epp",
"",
"NOTICE: The expiration date displayed in this record is the date the",
"registrar's sponsorship of the domain name registration in the registry is",
"currently set to expire. This date does not necessarily reflect the expiration",
"date of the domain name registrant's agreement with the sponsoring",
"registrar. Users may consult the sponsoring registrar's Whois database to",
"view the registrar's reported date of expiration for this registration.",
"",
"TERMS OF USE: You are not authorized to access or query our Whois",
"database through the use of electronic processes that are high-volume and",
"automated except as reasonably necessary to register domain names or",
"modify existing registrations; the Data in VeriSign Global Registry",
"Services' (\"VeriSign\") Whois database is provided by VeriSign for",
"information purposes only, and to assist persons in obtaining information",
"about or related to a domain name registration record. VeriSign does not",
"guarantee its accuracy. By submitting a Whois query, you agree to abide",
"by the following terms of use: You agree that you may use this Data only",
"for lawful purposes and that under no circumstances will you use this Data",
"to: (1) allow, enable, or otherwise support the transmission of mass",
"unsolicited, commercial advertising or solicitations via e-mail, telephone,",
"or facsimile; or (2) enable high volume, automated, electronic processes",
"that apply to VeriSign (or its computer systems). The compilation,",
"repackaging, dissemination or other use of this Data is expressly",
"prohibited without the prior written consent of VeriSign. You agree not to",
"use electronic processes that are automated and high-volume to access or",
"query the Whois database except as reasonably necessary to register",
"domain names or modify existing registrations. VeriSign reserves the right",
"to restrict your access to the Whois database in its sole discretion to ensure",
"operational stability. VeriSign may restrict or terminate your access to the",
"Whois database for failure to abide by these terms of use. VeriSign",
"reserves the right to modify these terms at any time.",
"",
"The Registry database contains ONLY .COM, .NET, .EDU domains and",
"Registrars."
]
},
"grs-whois.hichina.com": {
"Domain Status": [
"clientTransferProhibited https://icann.org/epp#clientTransferProhibited",
"clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited"
],
"Name Server": [
"F1G1NS1.DNSPOD.NET",
"F1G1NS2.DNSPOD.NET"
],
"Domain Name": "liaoxuefeng.com",
"Registry Domain ID": "1540937167_DOMAIN_COM-VRSN",
"Registrar WHOIS Server": "grs-whois.hichina.com",
"Registrar URL": "http://wanwang.aliyun.com",
"Updated Date": "2024-08-13T12:58:45Z",
"Created Date": "2009-02-05T01:51:44Z",
"Expiry Date": "2027-02-05T01:51:44Z",
"Registrar": "Alibaba Cloud Computing Ltd. d/b/a HiChina (www.net.cn)",
"Registrar IANA ID": "1599",
"Reseller": "",
"Registrant City": "",
"Registrant State/Province": "bei jing",
"Registrant Country": "CN",
"Registry Registrant ID": "",
"DNSSEC": "unsigned",
"Registrar Abuse Contact Email": "[email protected]",
"Registrar Abuse Contact Phone": "+86.95187",
"URL of the ICANN WHOIS Data Problem Reporting System": "http://wdprs.internic.net/",
">>>Last update of WHOIS database": "2025-02-01T01:02:31Z <<<",
"text": [
"Registrant Email:https://whois.aliyun.com/whois/whoisForm",
"",
"For more information on Whois status codes, please visit https://icann.org/epp",
"",
"Important Reminder: Per ICANN 2013RAA`s request, Hichina has modified domain names`whois format of dot com/net/cc/tv, you could refer to section 1.4 posted by ICANN on http://www.icann.org/en/resources/registrars/raa/approved-with-specs-27jun13-en.htm#whois The data in this whois database is provided to you for information purposes only, that is, to assist you in obtaining information about or related to a domain name registration record. We make this information available \"as is,\" and do not guarantee its accuracy. By submitting a whois query, you agree that you will use this data only for lawful purposes and that, under no circumstances will you use this data to: (1)enable high volume, automated, electronic processes that stress or load this whois database system providing you this information; or (2) allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations via direct mail, electronic mail, or by telephone. The compilation, repackaging, dissemination or other use of this data is expressly prohibited without prior written consent from us. We reserve the right to modify these terms at any time. By submitting this query, you agree to abide by these terms.For complete domain details go to:http://whois.aliyun.com/whois/domain/hichina.com"
]
}
}