作者: tianbao

  • 处理JavaScript错误的权威指南

    处理JavaScript错误的权威指南

    墨菲定律指出,任何可能出错的事情最终都会出错。这在编程世界中应用得太好了。如果您创建一个应用程序,您很可能会产生错误和其他问题。JavaScript中的错误就是这样一个常见问题!

    软件产品的成功取决于其创建者在伤害用户之前解决这些问题的能力。在所有编程语言中, JavaScript因其平均错误处理设计而臭名昭著。

    如果您正在构建一个JavaScript应用程序,那么您很有可能会在某一时刻弄乱数据类型。如果不是这样,那么您最终可能会将undefined替换为null或将三等号运算符 ( ===) 替换为双等号运算符 ( ==)。

    犯错是人之常情。这就是为什么我们将向您展示您需要了解的有关处理JavaScript错误的所有信息。

    本文将引导您了解JavaScript中的基本错误,并解释您可能遇到的各种错误。然后,您将学习如何识别和修复这些错误。还有一些技巧可以在生产环境中有效地处理错误。

    1. 什么是JavaScript错误?
    2. JavaScript中的错误类型
    3. 创建自定义错误类型
    4. JavaScript 中最常见的10个错误
    5. 如何识别和防止JavaScript中的错误
    6. 处理JavaScript错误的最佳实践

    什么是JavaScript错误?

    编程错误是指程序无法正常运行的情况。当程序不知道如何处理手头的工作时,可能会发生这种情况,例如尝试打开不存在的文件或在没有网络连接的情况下访问基于Web的API端点时。

    这些情况促使程序向用户抛出错误,说明它不知道如何继续。该程序收集尽可能多的有关错误的信息,然后报告它无法继续前进。

    聪明的程序员试图预测和覆盖这些场景,这样用户就不必独立地找出像“404”这样的技术错误信息。相反,它们显示了一条更容易理解的信息:“找不到该页面。”

    JavaScript中的错误是在发生编程错误时显示的对象。这些对象包含有关错误类型、导致错误的语句以及发生错误时的堆栈跟踪的大量信息。JavaScript还允许程序员创建自定义错误,以便在调试问题时提供额外信息。

    错误的属性

    现在JavaScript错误的定义已经很清楚了,是时候深入研究细节了。

    JavaScript中的错误带有某些标准和自定义属性,有助于理解错误的原因和影响。默认情况下,JavaScript中的错误包含三个属性:

    1. message : 携带错误信息的字符串值
    2. name:发生的错误类型(我们将在下一节深入探讨)
    3. stack:发生错误时执行的代码的堆栈跟踪。

    此外,error还可以携带columnNumber、lineNumber、fileName等属性,以更好地描述错误。但是,这些属性不是标准的,可能会出现在JavaScript应用程序生成的每个错误对象中,也可能不会出现。

    了解堆栈跟踪

    堆栈跟踪是发生异常或警告等事件时程序所在的方法调用列表。这是伴随异常的示例堆栈跟踪的样子:

    堆栈跟踪示例

    堆栈跟踪示例

    如您所见,它首先打印错误名称和消息,然后是被调用的方法列表。每个方法调用都说明其源代码的位置以及调用它的行。您可以使用这些数据浏览您的代码库并确定是哪段代码导致了错误。

    此方法列表以堆叠方式排列。它显示了您的异常首次引发的位置以及它如何通过堆叠的方法调用传播。为异常实现捕获不会让它通过堆栈向上传播并使您的程序崩溃。但是,您可能希望在某些情况下故意不捕获致命错误以使程序崩溃。

    错误与异常

    大多数人通常将错误和异常视为同一件事。但是,必须注意它们之间的细微但根本的区别。

    异常是已抛出的错误对象。

    为了更好地理解这一点,让我们举一个简单的例子。以下是如何在JavaScript中定义错误:

    const wrongTypeError = TypeError(“Wrong type found, expected character”)
    const wrongTypeError = TypeError(“Wrong type found, expected character”)
    const wrongTypeError = TypeError("Wrong type found, expected character")

    这就是wrongTypeError对象变成异常的方式:

    throw wrongTypeError
    throw wrongTypeError
    throw wrongTypeError

    然而,大多数人倾向于使用在抛出错误对象时定义错误对象的简写形式:

    throw TypeError(“Wrong type found, expected character”)
    throw TypeError(“Wrong type found, expected character”)
    throw TypeError("Wrong type found, expected character")

    这是标准做法。然而,这也是开发人员倾向于混淆异常和错误的原因之一。因此,即使您使用速记来快速完成工作,了解基础知识也至关重要。

    JavaScript中的错误类型

    JavaScript中有一系列预定义的错误类型。只要程序员没有明确处理应用程序中的错误,它们就会由 JavaScript 运行时自动选择和定义。

    本节将引导您了解JavaScript中一些最常见的错误类型,并了解它们发生的时间和原因。

    范围错误

    当变量设置为超出其合法值范围时,会引发RangeError。它通常发生在将值作为参数传递给函数时,并且给定值不在函数参数的范围内。使用文档记录不佳的第三方库时,有时修复起来会很棘手,因为您需要知道参数的可能值范围才能传递正确的值。

    RangeError发生的一些常见场景是:

    • 试图通过Array构造函数创建一个非法长度的数组。
    • 将错误值传递给数字方法,如toExponential()toPrecision(),toFixed()等。
    • 将非法值传递给字符串函数,例如normalize().

    参考错误

    当您的代码中的变量引用出现问题时,就会发生ReferenceError。您可能忘记在使用变量之前为其定义值,或者您可能试图在代码中使用不可访问的变量。在任何情况下,通过堆栈跟踪提供了充足的信息来查找和修复有错误的变量引用。

    ReferenceErrors发生的一些常见原因是:

    • 在变量名中打错字。
    • 试图访问其范围之外的块范围变量。
    • 在加载之前从外部库引用全局变量(例如 $ from jQuery)。

    语法错误

    这些错误是最容易修复的错误之一,因为它们表明代码语法有错误。由于JavaScript是一种解释而不是编译的脚本语言,因此当应用程序执行包含错误的脚本时会抛出这些脚本语言。在编译语言的情况下,在编译过程中会识别出此类错误。因此,在修复之前不会创建应用程序二进制文件。

    可能发生SyntaxErrors的一些常见原因是:

    • 缺少引号
    • 缺少右括号
    • 花括号或其他字符的不正确对齐

    最好在IDE中使用linting工具在此类错误出现在浏览器之前为您识别这些错误。

    类型错误

    TypeError是JavaScript应用程序中最常见的错误之一。当某些值不是特定的预期类型时,会创建此错误。发生时的一些常见情况是:

    • 调用不是方法的对象。
    • 试图访问空对象或未定义对象的属性
    • 将字符串视为数字,反之亦然

    发生TypeError的可能性还有很多。稍后我们将查看一些著名的实例并学习如何修复它们。

    内部错误

    当JavaScript运行时引擎中发生异常时使用InternalError类型。它可能表示也可能不表示您的代码存在问题。

    通常,InternalError仅在两种情况下发生:

    • 当JavaScript运行时的补丁或更新带有引发异常的错误时(这种情况很少发生)
    • 当你的代码包含对JavaScript引擎来说太大的实体时(例如太多的switch case、太大的数组初始化器、太多的递归)

    解决此错误的最合适方法是通过错误消息确定原因,并在可能的情况下重构您的应用程序逻辑,以消除JavaScript引擎上的工作负载突然激增。

    URI错误

    URIError发生在全局URI处理函数如decodeURIComponent被非法使用时。它通常表示传递给方法调用的参数不符合URI标准,因此没有被方法正确解析

    诊断这些错误通常很容易,因为您只需要检查参数是否存在畸形。

    评估错误

    当函数eval()调用发生错误时会发生EvalError 。eval()函数用于执行存储在字符串中的 JavaScript 代码。但是,由于安全问题,强烈建议不要使用eval()函数,并且当前的ECMAScript规范不再抛出EvalError类,因此存在此错误类型只是为了保持与旧版JavaScript代码的向后兼容性。

    如果您使用的是旧版本的JavaScript,则可能会遇到此错误。无论如何,最好调查eval()函数调用中执行的代码是否有任何异常。

    创建自定义错误类型

    虽然JavaScript提供了足够的错误类型列表来涵盖大多数场景,但如果列表不满足您的要求,您始终可以创建新的错误类型。这种灵活性的基础在于JavaScript允许您使用throw命令逐字地抛出任何东西。

    因此,从技术上讲,这些声明是完全合法的:

    throw 8
    throw “An error occurred”
    throw 8
    throw “An error occurred”
    throw 8
    throw "An error occurred"

    但是,抛出原始数据类型不会提供有关错误的详细信息,例如其类型、名称或随附的堆栈跟踪。为了解决这个问题并标准化错误处理过程,我们提供了Error这个类。也不鼓励在抛出异常时使用原始数据类型。

    您可以扩展Error类以创建您的自定义错误类。以下是如何执行此操作的基本示例:

    class ValidationError extends Error {
    constructor(message) {
    super(message);
    this.name = “ValidationError”;
    }
    }
    class ValidationError extends Error {
    constructor(message) {
    super(message);
    this.name = “ValidationError”;
    }
    }
    class ValidationError extends Error {
    constructor(message) {
    super(message);
    this.name = "ValidationError";
    }
    }

    您可以通过以下方式使用它:

    throw ValidationError(“Property not found: name”)
    throw ValidationError(“Property not found: name”)
    throw ValidationError("Property not found: name")

    然后您可以使用instanceof关键字识别它:

    try {
    validateForm() // code that throws a ValidationError
    } catch (e) {
    if (e instanceof ValidationError)
    // do something
    else
    // do something else
    }
    try {
    validateForm() // code that throws a ValidationError
    } catch (e) {
    if (e instanceof ValidationError)
    // do something
    else
    // do something else
    }
    try {
    validateForm() // code that throws a ValidationError
    } catch (e) {
    if (e instanceof ValidationError)
    // do something
    else
    // do something else
    }

    JavaScript中最常见的10个错误

    现在您已经了解了常见的错误类型以及如何创建自定义错误类型,是时候看看您在编写JavaScript代码时会遇到的一些最常见的错误了。

    1. Uncaught RangeError

    在几种不同的情况下,Google Chrome中会出现此错误。首先,如果您调用递归函数并且它不会终止,则可能会发生这种情况。您可以在Chrome开发者控制台中自行查看:

    带有递归函数调用的RangeError示例

    带有递归函数调用的RangeError示例

    因此,要解决此类错误,请确保正确定义递归函数的边界情况。发生此错误的另一个原因是您传递的值超出了函数的参数范围。这是一个例子:

    带有toExponential()调用的RangeError示例

    带有toExponential()调用的RangeError示例

    错误消息通常会指出您的代码有什么问题。一旦你做出改变,它就会得到解决。

    toExponential() 函数调用的输出

    toExponential() 函数调用的输出

    2. Uncaught TypeError: Cannot set property

    当您在未定义的引用上设置属性时会发生此错误。您可以使用此代码重现该问题:

    var list
    list.count = 0
    var list
    list.count = 0
    var list
    list.count = 0

    这是您将收到的输出:

    类型错误示例

    类型错误示例

    要修复此错误,请在访问其属性之前使用值初始化引用。以下是修复后的外观:

    如何修复类型错误

    如何修复类型错误

    3. Uncaught TypeError: Cannot read property

    这是JavaScript中最常出现的错误之一。当您尝试读取属性或调用未定义对象的函数时,会发生此错误。您可以通过在Chrome开发人员控制台中运行以下代码来非常轻松地重现它:

    var func
    func.call()
    var func
    func.call()
    var func
    func.call()

    这是输出:

    带有未定义函数的TypeError示例

    带有未定义函数的TypeError示例

    未定义的对象是导致此错误的众多可能原因之一。此问题的另一个突出原因可能是在呈现 UI 时未正确初始化状态。这是来自React应用程序的真实示例:

    import React, { useState, useEffect } from “react”;
    const CardsList = () => {
    const [state, setState] = useState();
    useEffect(() => {
    setTimeout(() => setState({ items: [“Card 1”, “Card 2”] }), 2000);
    }, []);
    return (
    <>
    {state.items.map((item) => (
    <li key={item}>{item}</li>
    ))}
    </>
    );
    };
    export default CardsList;
    import React, { useState, useEffect } from “react”;
    const CardsList = () => {
    const [state, setState] = useState();
    useEffect(() => {
    setTimeout(() => setState({ items: [“Card 1”, “Card 2”] }), 2000);
    }, []);
    return (
    <>
    {state.items.map((item) => (
    <li key={item}>{item}</li>
    ))}
    </>
    );
    };
    export default CardsList;
    import React, { useState, useEffect } from "react";
    const CardsList = () => {
    const [state, setState] = useState();
    useEffect(() => {
    setTimeout(() => setState({ items: ["Card 1", "Card 2"] }), 2000);
    }, []);
    return (
    <>
    {state.items.map((item) => (
    <li key={item}>{item}</li>
    ))}
    </>
    );
    };
    export default CardsList;

    该应用程序从一个空状态容器开始,并在延迟2秒后提供一些项目。延迟用于模拟网络调用。即使您的网络速度非常快,您仍然会面临轻微的延迟,因为该组件将至少呈现一次。如果您尝试运行此应用程序,您将收到以下错误:

    浏览器中的TypeError堆栈跟踪

    浏览器中的TypeError堆栈跟踪

    这是因为,在渲染时,状态容器是未定义的;因此,它不存在任何财产items。修复这个错误很容易。您只需要为状态容器提供初始默认值。

    // …
    const [state, setState] = useState({items: []});
    // …
    // …
    const [state, setState] = useState({items: []});
    // …
    // ...
    const [state, setState] = useState({items: []});
    // ...

    现在,在设置延迟之后,您的应用程序将显示类似的输出:

    代码输出

    代码输出

    代码中的确切修复可能会有所不同,但这里的本质是始终在使用变量之前正确初始化它们。

    4. TypeError: ‘undefined’ is not an object

    当您尝试访问未定义对象的属性或调用未定义对象的方法时,会在Safari中发生此错误。您可以从上面运行相同的代码来自己重现错误。

    带有未定义函数的TypeError示例

    带有未定义函数的TypeError示例

    这个错误的解决方法也是一样的——确保你已经正确地初始化了你的变量,并且在访问一个属性或方法时它们不是未定义的。

    5. TypeError: null is not an object

    这又与前面的错误相似。它发生在Safari上,这两个错误之间的唯一区别是,当正在访问其属性或方法的对象null不是undefined. 您可以通过运行以下代码来重现这一点:

    var func = null
    func.call()
    var func = null
    func.call()
    var func = null
    func.call()

    这是您将收到的输出:

    带有null函数的TypeError示例

    带有null函数的TypeError示例

    因为null是显式设置为变量的值,而不是由JavaScript自动分配的值。仅当您尝试访问null自己设置的变量时,才会发生此错误。因此,您需要重新访问您的代码并检查您编写的逻辑是否正确。

    6. TypeError: Cannot read property ‘length’

    当您尝试读取nullundefined对象的长度时,Chrome中会出现此错误。这个问题的原因和前面的问题类似,但是在处理列表的时候出现的频率比较高;因此值得特别提及。以下是重现问题的方法:

    带有未定义对象的TypeError示例

    带有未定义对象的TypeError示例

    但是,在较新版本的Chrome中,此错误报告为Uncaught TypeError: Cannot read properties of undefined. 这是它现在的样子:

    在较新的Chrome版本上带有未定义对象的TypeError示例

    在较新的Chrome版本上带有未定义对象的TypeError示例

    再次,修复是确保您尝试访问其长度的对象存在并且未设置为null.

    7. TypeError: ‘undefined’ is not a function

    当您尝试调用脚本中不存在的方法或该方法存在但无法在调用上下文中引用时,会发生此错误。这个错误通常发生在谷歌浏览器中,您可以通过检查抛出错误的代码行来解决它。如果您发现拼写错误,请修复它并检查它是否能解决您的问题。

    如果您在代码中使用了自引用关键字this,如果this没有适当地绑定到您的上下文,则可能会出现此错误。考虑下面的代码:

    function showAlert() {
    alert(“message here”)
    }
    document.addEventListener(“click”, () => {
    this.showAlert();
    })
    function showAlert() {
    alert(“message here”)
    }
    document.addEventListener(“click”, () => {
    this.showAlert();
    })
    function showAlert() {
    alert("message here")
    }
    document.addEventListener("click", () => {
    this.showAlert();
    })

    如果执行上述代码,它将抛出我们讨论过的错误。之所以会发生这种情况,是因为作为事件侦听器传递的匿名函数正在document的上下文中执行。

    相比之下,showAlert函数是在window的上下文中定义的。

    为了解决这个问题,您必须通过将函数与bind()方法绑定来传递对函数的正确引用:

    document.addEventListener(“click”, this.showAlert.bind(this))
    document.addEventListener(“click”, this.showAlert.bind(this))
    document.addEventListener("click", this.showAlert.bind(this))

    8. ReferenceError: event is not defined

    当您尝试访问未在调用范围内定义的引用时,会发生此错误。这通常发生在处理事件时,因为它们经常为您提供event回调函数中调用的引用。如果您忘记在函数的参数中定义事件参数或拼写错误,则可能会发生此错误。

    在Internet Explorer或Google Chrome中可能不会发生此错误(因为IE提供了一个全局事件变量,并且Chrome会自动将事件变量附加到处理程序),但它可能在Firefox中发生。所以建议留意这样的小错误。

    9. TypeError: Assignment to constant variable

    这是由于粗心造成的错误。如果您尝试将新值分配给常量变量,您将遇到这样的结果:

    带有常量对象分配的TypeError示例

    带有常量对象分配的TypeError示例

    虽然现在看起来很容易修复,但想象一下数百个这样的变量声明,其中一个被错误地定义为const而不是let! 与PHP等其他脚本语言不同,在JavaScript中声明常量和变量的风格差别很小。因此,当您遇到此错误时,建议首先检查您的声明。如果您忘记上述引用是一个常量并将其用作变量,您也可能会遇到此错误。这表明您的应用程序逻辑存在粗心或缺陷。尝试解决此问题时,请务必检查此项。

    10.(unknown): Script error

    当第三方脚本向您的浏览器发送错误时,就会发生脚本错误。此错误后跟(未知),因为第三方脚本与您的应用属于不同的域。浏览器隐藏了其他细节,以防止第三方脚本泄露敏感信息。

    在不了解完整详细信息的情况下,您无法解决此错误。您可以执行以下操作来获取有关该错误的更多信息:

    1. 在脚本标签中添加crossorigin属性。
    2. 在托管脚本的服务器上设置正确的Access-Control-Allow-Origin标头。
    3. [可选] 如果您无权访问托管脚本的服务器,您可以考虑使用代理将您的请求中继到服务器并返回到带有正确标头的客户端。

    一旦您可以访问错误的详细信息,您就可以着手解决问题,这可能与第三方库或网络有关。

    如何识别和防止JavaScript中的错误

    虽然上面讨论的错误是JavaScript中最常见和最常见的错误,但您会遇到,仅仅依靠几个示例是远远不够的。在开发JavaScript应用程序时,了解如何检测和防止任何类型的错误至关重要。以下是如何处理JavaScript中的错误。

    手动抛出和捕获错误

    处理手动或运行时抛出的错误的最基本方法是捕获它们。与大多数其他语言一样,JavaScript提供了一组关键字来处理错误。在着手处理JavaScript应用程序中的错误之前,必须深入了解它们中的每一个。

    throw

    该集合的第一个也是最基本的关键字是throw. 很明显,throw关键字用于抛出错误以在JavaScript运行时手动创建异常。我们已经在本文前面讨论过这个问题,这里是这个关键字意义的要点:

    • 你可以throw做任何事情,包括数字、字符串和Error对象。
    • 但是,不建议抛出诸如字符串和数字之类的原始数据类型,因为它们不携带有关错误的调试信息。
    • 例子:throw TypeError("Please provide a string")

    try

    try关键字用于指示代码块可能会引发异常。它的语法是:

    try {
    // error-prone code here
    }
    try {
    // error-prone code here
    }
    try {
    // error-prone code here
    }

    重要的是要注意,catch块必须始终跟随try块才能有效地处理错误。

    catch

    catch关键字用于创建一个catch块。此代码块负责处理尾随try块捕获的错误。这是它的语法:

    catch (exception) {
    // code to handle the exception here
    }
    catch (exception) {
    // code to handle the exception here
    }
    catch (exception) {
    // code to handle the exception here
    }

    这就是你如何一起实现trycatch块的方式:

    try {
    // business logic code
    } catch (exception) {
    // error handling code
    }
    try {
    // business logic code
    } catch (exception) {
    // error handling code
    }
    try {
    // business logic code
    } catch (exception) {
    // error handling code
    }

    与C++或Java不同,您不能将多个catch块附加到JavaScript中的try块。这意味着您不能这样做:

    try {
    // business logic code
    } catch (exception) {
    if (exception instanceof TypeError) {
    // do something
    }
    } catch (exception) {
    if (exception instanceof RangeError) {
    // do something
    }
    }
    try {
    // business logic code
    } catch (exception) {
    if (exception instanceof TypeError) {
    // do something
    }
    } catch (exception) {
    if (exception instanceof RangeError) {
    // do something
    }
    }
    try {
    // business logic code
    } catch (exception) {
    if (exception instanceof TypeError) {
    // do something
    }
    } catch (exception) {
    if (exception instanceof RangeError) {
    // do something
    }
    }

    相反,您可以在单个catch块中使用if...else语句或switch case语句来处理所有可能的错误情况。它看起来像这样:

    try {
    // business logic code
    } catch (exception) {
    if (exception instanceof TypeError) {
    // do something
    } else if (exception instanceof RangeError) {
    // do something else
    }
    }
    try {
    // business logic code
    } catch (exception) {
    if (exception instanceof TypeError) {
    // do something
    } else if (exception instanceof RangeError) {
    // do something else
    }
    }
    try {
    // business logic code
    } catch (exception) {
    if (exception instanceof TypeError) {
    // do something
    } else if (exception instanceof RangeError) {
    // do something else
    }
    }

    finally

    finally关键字用于定义在处理错误后运行的代码块。该块在try和catch块之后执行。

    此外,无论其他两个块的结果如何,都会执行finally块。这意味着即使catch块不能完全处理错误或者catch块中抛出错误,解释器也会在程序崩溃之前执行finally块中的代码。

    要被认为是有效的,JavaScript中的try块需要后跟catch或finally块。如果没有这些,解释器将引发SyntaxError。因此,在处理错误时,请确保至少遵循您的try块。

    使用onerror()方法全局处理错误

    onerror()方法适用于所有HTML元素,用于处理它们可能发生的任何错误。例如,如果img标签找不到指定URL的图像,它会触发其onerror方法以允许用户处理错误。

    通常,您会在onerror调用中提供另一个图像URL,以便img标记回退到。这是您可以通过JavaScript执行此操作的方法:

    const image = document.querySelector(“img”)
    image.onerror = (event) => {
    console.log(“Error occurred: “ + event)
    }
    const image = document.querySelector(“img”)
    image.onerror = (event) => {
    console.log(“Error occurred: ” + event)
    }
    const image = document.querySelector("img")
    image.onerror = (event) => {
    console.log("Error occurred: " + event)
    }

    但是,您可以使用此功能为您的应用创建全局错误处理机制。以下是您的操作方法:

    window.onerror = (event) => {
    console.log(“Error occurred: “ + event)
    }
    window.onerror = (event) => {
    console.log(“Error occurred: ” + event)
    }
    window.onerror = (event) => {
    console.log("Error occurred: " + event)
    }

    使用此事件处理程序,您可以摆脱try...catch代码中的多个块,并集中您的应用程序的错误处理,类似于事件处理。您可以将多个错误处理程序附加到窗口,以维护SOLID设计原则中的单一责任原则。解释器将循环遍历所有处理程序,直到到达适当的处理程序。

    通过回调传递错误

    虽然简单和线性函数允许错误处理保持简单,但回调会使事情复杂化。

    考虑以下代码:

    const calculateCube = (number, callback) => {
    setTimeout(() => {
    const cube = number * number * number
    callback(cube)
    }, 1000)
    }
    const callback = result => console.log(result)
    calculateCube(4, callback)
    const calculateCube = (number, callback) => {
    setTimeout(() => {
    const cube = number * number * number
    callback(cube)
    }, 1000)
    }
    const callback = result => console.log(result)
    calculateCube(4, callback)
    const calculateCube = (number, callback) => {
    setTimeout(() => {
    const cube = number * number * number
    callback(cube)
    }, 1000)
    }
    const callback = result => console.log(result)
    calculateCube(4, callback)

    上面的函数演示了一个异步条件,其中一个函数需要一些时间来处理操作并稍后在回调的帮助下返回结果。

    如果您尝试在函数调用中输入字符串而不是4,您将得到NaN结果。

    这需要妥善处理。就是这样:

    const calculateCube = (number, callback) => {
    setTimeout(() => {
    if (typeof number !== “number”)
    throw new Error(“Numeric argument is expected”)
    const cube = number * number * number
    callback(cube)
    }, 1000)
    }
    const callback = result => console.log(result)
    try {
    calculateCube(4, callback)
    } catch (e) { console.log(e) }
    const calculateCube = (number, callback) => {
    setTimeout(() => {
    if (typeof number !== “number”)
    throw new Error(“Numeric argument is expected”)
    const cube = number * number * number
    callback(cube)
    }, 1000)
    }
    const callback = result => console.log(result)
    try {
    calculateCube(4, callback)
    } catch (e) { console.log(e) }
    const calculateCube = (number, callback) => {
    setTimeout(() => {
    if (typeof number !== "number")
    throw new Error("Numeric argument is expected")
    const cube = number * number * number
    callback(cube)
    }, 1000)
    }
    const callback = result => console.log(result)
    try {
    calculateCube(4, callback)
    } catch (e) { console.log(e) }

    这应该可以理想地解决问题。但是,如果您尝试将字符串传递给函数调用,您将收到以下信息:

    错误参数的错误示例

    错误参数的错误示例

    即使您在调用函数时实现了try-catch块,它仍然表示错误未捕获。由于超时延迟,在执行catch块后抛出错误。

    这可能在网络调用中很快发生,在这种情况下会出现意外延迟。您需要在开发应用程序时涵盖此类情况。

    以下是在回调中正确处理错误的方法:

    const calculateCube = (number, callback) => {
    setTimeout(() => {
    if (typeof number !== “number”) {
    callback(new TypeError(“Numeric argument is expected”))
    return
    }
    const cube = number * number * number
    callback(null, cube)
    }, 2000)
    }
    const callback = (error, result) => {
    if (error !== null) {
    console.log(error)
    return
    }
    console.log(result)
    }
    try {
    calculateCube(‘hey’, callback)
    } catch (e) {
    console.log(e)
    }
    const calculateCube = (number, callback) => {
    setTimeout(() => {
    if (typeof number !== “number”) {
    callback(new TypeError(“Numeric argument is expected”))
    return
    }
    const cube = number * number * number
    callback(null, cube)
    }, 2000)
    }
    const callback = (error, result) => {
    if (error !== null) {
    console.log(error)
    return
    }
    console.log(result)
    }
    try {
    calculateCube(‘hey’, callback)
    } catch (e) {
    console.log(e)
    }
    const calculateCube = (number, callback) => {
    setTimeout(() => {
    if (typeof number !== "number") {
    callback(new TypeError("Numeric argument is expected"))
    return
    }
    const cube = number * number * number
    callback(null, cube)
    }, 2000)
    }
    const callback = (error, result) => {
    if (error !== null) {
    console.log(error)
    return
    }
    console.log(result)
    }
    try {
    calculateCube('hey', callback)
    } catch (e) {
    console.log(e)
    }

    现在,控制台的输出将是:

    带有非法参数的TypeError示例

    带有非法参数的TypeError示例

    这表明错误已得到适当处理。

    处理Promise中的错误

    大多数人倾向于使用Promise来处理异步活动。Promise还有另一个优点——被拒绝的Promise不会终止你的脚本。但是,您仍然需要实现一个catch块来处理Promise中的错误。为了更好地理解这一点,让我们使用Promises重写calculateCube()函数:

    const delay = ms => new Promise(res => setTimeout(res, ms));
    const calculateCube = async (number) => {
    if (typeof number !== “number”)
    throw Error(“Numeric argument is expected”)
    await delay(5000)
    const cube = number * number * number
    return cube
    }
    try {
    calculateCube(4).then(r => console.log(r))
    } catch (e) { console.log(e) }
    const delay = ms => new Promise(res => setTimeout(res, ms));
    const calculateCube = async (number) => {
    if (typeof number !== “number”)
    throw Error(“Numeric argument is expected”)
    await delay(5000)
    const cube = number * number * number
    return cube
    }
    try {
    calculateCube(4).then(r => console.log(r))
    } catch (e) { console.log(e) }
    const delay = ms => new Promise(res => setTimeout(res, ms));
    const calculateCube = async (number) => {
    if (typeof number !== "number")
    throw Error("Numeric argument is expected")
    await delay(5000)
    const cube = number * number * number
    return cube
    }
    try {
    calculateCube(4).then(r => console.log(r))
    } catch (e) { console.log(e) }

    前面代码中的超时已被隔离到delay函数中以便理解。如果您尝试输入一个字符串而不是4,您获得的输出将类似于以下内容:

    在Promise中带有非法参数的TypeError示例

    在Promise中带有非法参数的TypeError示例

    同样,这是由于Promise在其他所有内容完成执行后引发错误。这个问题的解决方案很简单。只需像这样向Promise链添加调用catch()

    calculateCube(“hey”)
    .then(r => console.log(r))
    .catch(e => console.log(e))
    calculateCube(“hey”)
    .then(r => console.log(r))
    .catch(e => console.log(e))
    calculateCube("hey")
    .then(r => console.log(r))
    .catch(e => console.log(e))

    现在输出将是:

    处理带有非法参数的TypeError示例

    处理带有非法参数的TypeError示例

    您可以观察到使用Promise处理错误是多么容易。此外,您可以链接finally()块和promise调用以添加将在错误处理完成后运行的代码。

    或者,您也可以使用传统的try-catch-finally技术来处理Promise中的错误。在这种情况下,您的promise调用如下所示:

    try {
    let result = await calculateCube(“hey”)
    console.log(result)
    } catch (e) {
    console.log(e)
    } finally {
    console.log(‘Finally executed”)
    }
    try {
    let result = await calculateCube(“hey”)
    console.log(result)
    } catch (e) {
    console.log(e)
    } finally {
    console.log(‘Finally executed”)
    }
    try {
    let result = await calculateCube("hey")
    console.log(result)
    } catch (e) {
    console.log(e)
    } finally {
    console.log('Finally executed")
    }

    但是,这仅适用于异步函数。因此,在Promise中处理错误的最优选方式是链式连接catchfinally连接到Promise调用。

    throw/catch vs onerror() vs Callbacks vs Promises:哪种方法更佳?

    有四种方法可供您使用,您必须知道如何在任何给定的用例中选择最合适的方法。以下是您可以自己决定的方法:

    throw/catch

    您将在大多数情况下使用此方法。确保在你的catch块中为所有可能的错误实现条件,如果你需要在try块之后运行一些内存清理例程,请记住包含一个finally块。

    但是,太多的try/catch块会使您的代码难以维护。如果您发现自己处于这种情况,您可能希望通过全局处理程序或promise方法来处理错误。

    在异步try/catch块和promise的catch()之间做出决定时,建议使用异步try/catch块,因为它们将使您的代码线性且易于调试。

    onerror()

    当您知道您的应用程序必须处理许多错误并且它们可以很好地分散在整个代码库中时,最好使用onerror()方法。onerror方法使您能够处理错误,就好像它们只是您的应用程序处理的另一个事件一样。您可以定义多个错误处理程序并在初始呈现时将它们附加到应用程序的窗口。

    但是,您还必须记住,在错误范围较小的较小项目中设置onerror()方法可能会带来不必要的挑战。如果您确定您的应用程序不会抛出太多错误,那么传统的throw/catch方法将最适合您。

    Callbacks and Promises

    回调和承诺中的错误处理因代码设计和结构而异。但是,如果您在编写代码之前在这两者之间进行选择,最好使用Promise。

    这是因为Promise具有用于链接catch()finally()块以轻松处理错误的内置结构。这种方法比定义附加参数/重用现有参数来处理错误更容易和更清晰。

    使用Git存储库跟踪更改

    由于代码库中的手动错误,经常会出现许多错误。在开发或调试代码时,您最终可能会进行不必要的更改,这可能会导致代码库中出现新的错误。自动化测试是在每次更改后检查代码的好方法。但是,它只能告诉您是否有问题。如果你不经常备份你的代码,你最终会浪费时间试图修复一个以前运行良好的函数或脚本。

    这就是git发挥作用的地方。通过适当的提交策略,您可以使用您的git历史作为备份系统来查看您的代码在开发过程中的演变过程。您可以轻松地浏览旧提交并找出该函数的版本之前运行良好,但在不相关的更改后抛出错误。

    然后,您可以恢复旧代码或比较两个版本以确定哪里出了问题。现代Web开发工具(如GitHub Desktop或GitKraken)可帮助您并排可视化这些更改并快速找出错误。

    一个可以帮助您减少错误的习惯是 在您对代码进行重大更改时运行代码审查。如果您在一个团队中工作,您可以创建一个拉取请求并让团队成员彻底审查它。这将帮助您使用第二双眼睛来发现您可能遗漏的任何错误。

    处理JavaScript错误的最佳实践

    上述方法足以帮助您为下一个JavaScript应用程序设计一个健壮的错误处理方法。但是,最好在实施时记住一些事情,以充分利用您的防错功能。这里有一些提示可以帮助您。

    1. 处理操作异常时使用自定义错误

    我们在本指南的前面介绍了自定义错误,让您了解如何根据应用程序的独特情况自定义错误处理。建议尽可能使用自定义错误而不是泛型Error类,因为它为调用环境提供了有关错误的更多上下文信息。

    最重要的是,自定义错误允许您调整错误在调用环境中的显示方式。这意味着您可以根据需要选择隐藏特定详细信息或显示有关错误的其他信息。

    您可以根据需要格式化错误内容。这使您可以更好地控制错误的解释和处理方式。

    2.不要吞下任何例外

    即使是最资深的开发人员也经常犯一个新手错误——在他们的代码中使用异常级别。

    您可能会遇到有一段代码可以选择运行的情况。如果它有效,那就太好了;如果没有,你不需要做任何事情。

    在这些情况下,通常很想将这段代码放在try块中,并在其上附加一个空的catch块。但是,通过这样做,您将使那段代码保持开放状态,从而导致任何类型的错误并逃脱惩罚。如果你有一个庞大的代码库和许多这样糟糕的错误管理结构的实例,这可能会变得很危险。

    处理异常的最好方法是确定所有异常都将被处理的级别并将它们提高到那里。此级别可以是控制器(在MVC架构应用程序中)或中间件(在传统的面向服务器的应用程序中)。

    通过这种方式,您将了解在哪里可以找到应用程序中发生的所有错误并选择如何解决它们,即使这意味着不对它们做任何事情。

    3. 对日志和错误警报使用集中策略

    记录错误通常是处理错误的一个组成部分。那些未能制定集中策略来记录错误的人可能会错过有关其应用程序使用情况的宝贵信息。

    应用程序的事件日志可以帮助您找出有关错误的关键数据并帮助快速调试它们。如果您在应用程序中设置了适当的警报机制,您可以在错误到达大部分用户群之前知道应用程序何时发生错误。

    建议使用预先构建的记录器或创建一个以满足您的需求。您可以配置此记录器以根据其级别(警告、调试、信息等)处理错误,并且一些记录器甚至可以立即将日志发送到远程记录服务器。通过这种方式,您可以观察应用程序的逻辑在活动用户中的执行情况。

    4. 适当地通知用户错误

    在定义错误处理策略时要牢记的另一个要点是牢记用户。

    所有干扰您的应用程序正常运行的错误都必须向用户显示可见的警报,以通知他们出现问题,以便用户可以尝试制定解决方案。如果您知道错误的快速修复方法,例如重试操作或注销并重新登录,请务必在警报中提及它以帮助实时修复用户体验。

    如果错误不会对日常用户体验造成任何干扰,您可以考虑抑制警报并将错误记录到远程服务器以供以后解决。

    5. 实现一个中间件(Node.js)

    Node.js环境支持中间件向服务器应用程序添加功能。 您可以使用此功能为您的服务器创建错误处理中间件。

    使用中间件的最大好处是所有错误都集中在一个地方处理。您可以轻松选择启用/禁用此设置以进行测试。

    以下是创建基本中间件的方法:

    const logError = err => {
    console.log(“ERROR: “ + String(err))
    }
    const errorLoggerMiddleware = (err, req, res, next) => {
    logError(err)
    next(err)
    }
    const returnErrorMiddleware = (err, req, res, next) => {
    res.status(err.statusCode || 500)
    .send(err.message)
    }
    module.exports = {
    logError,
    errorLoggerMiddleware,
    returnErrorMiddleware
    }
    const logError = err => {
    console.log(“ERROR: ” + String(err))
    }
    const errorLoggerMiddleware = (err, req, res, next) => {
    logError(err)
    next(err)
    }
    const returnErrorMiddleware = (err, req, res, next) => {
    res.status(err.statusCode || 500)
    .send(err.message)
    }
    module.exports = {
    logError,
    errorLoggerMiddleware,
    returnErrorMiddleware
    }
    const logError = err => {
    console.log("ERROR: " + String(err))
    }
    const errorLoggerMiddleware = (err, req, res, next) => {
    logError(err)
    next(err)
    }
    const returnErrorMiddleware = (err, req, res, next) => {
    res.status(err.statusCode || 500)
    .send(err.message)
    }
    module.exports = {
    logError,
    errorLoggerMiddleware,
    returnErrorMiddleware
    }

    然后,您可以在您的应用程序中使用此中间件,如下所示:

    const { errorLoggerMiddleware, returnErrorMiddleware } = require(‘./errorMiddleware’)
    app.use(errorLoggerMiddleware)
    app.use(returnErrorMiddleware)
    const { errorLoggerMiddleware, returnErrorMiddleware } = require(‘./errorMiddleware’)
    app.use(errorLoggerMiddleware)
    app.use(returnErrorMiddleware)
    const { errorLoggerMiddleware, returnErrorMiddleware } = require('./errorMiddleware')
    app.use(errorLoggerMiddleware)
    app.use(returnErrorMiddleware)

    您现在可以在中间件中定义自定义逻辑以适当地处理错误。您不再需要担心在整个代码库中实现单个错误处理结构。

    6. 重新启动您的应用程序以处理程序员错误(Node.js)

    当Node.js应用程序遇到程序员错误时,它们可能不一定会抛出异常并尝试关闭应用程序。此类错误可能包括由程序员错误引起的问题,例如高CPU消耗、内存膨胀或内存泄漏。处理这些问题的最佳方法是通过Node.js集群模式或PM2等独特工具使应用程序崩溃,从而优雅地重新启动应用程序。这可以确保应用程序不会因用户操作而崩溃,从而呈现糟糕的用户体验。

    7. 捕获所有未捕获的异常(Node.js)

    您永远无法确定您已经涵盖了您的应用程序中可能出现的所有错误。因此,实施备用策略以从您的应用程序中捕获所有未捕获的异常非常重要。

    您可以这样做:

    process.on(‘uncaughtException’, error => {
    console.log(“ERROR: “ + String(error))
    // other handling mechanisms
    })
    process.on(‘uncaughtException’, error => {
    console.log(“ERROR: ” + String(error))
    // other handling mechanisms
    })
    process.on('uncaughtException', error => {
    console.log("ERROR: " + String(error))
    // other handling mechanisms
    })

    您还可以确定发生的错误是标准异常还是自定义操作错误。根据结果​​,您可以退出进程并重新启动它以避免意外行为。

    8. 捕获所有未处理的Promise Rejections (Node.js)

    与您永远无法涵盖所有​​可能的异常类似,您很有可能会错过处理所有可能的Promise Rejections。但是,与异常不同,Promise Rejection不会引发错误。

    因此,一个重要的Promise Rejection可能会作为警告而溜走,并使您的应用程序面临遇到意外行为的可能性。因此,实现一个回退机制来处理Promise Rejection是至关重要的。

    您可以这样做:

    const promiseRejectionCallback = error => {
    console.log(“PROMISE REJECTED: “ + String(error))
    }
    process.on(‘unhandledRejection’, callback)
    const promiseRejectionCallback = error => {
    console.log(“PROMISE REJECTED: ” + String(error))
    }
    process.on(‘unhandledRejection’, callback)
    const promiseRejectionCallback = error => {
    console.log("PROMISE REJECTED: " + String(error))
    }
    process.on('unhandledRejection', callback)
    

    小结

    与任何其他编程语言一样,JavaScript中的错误非常频繁且自然。在某些情况下,您甚至可能需要故意抛出错误以向用户指示正确的响应。因此,了解它们的解剖结构和类型非常重要。

    此外,您需要配备正确的工具和技术来识别和防止错误导致您的应用程序崩溃。

    在大多数情况下,对于所有类型的JavaScript应用程序来说,通过仔细执行来处理错误的可靠策略就足够了。

  • 如何修复WordPress“另一个更新正在进行”错误

    错误类型:
    WP内部错误
    错误名称:
    另一个更新正在进行中
    英文名称:
    Another update is currently in progress
    错误描述:
    当执行WordPress相关更新时,WordPress会锁定您的数据库,但有时锁定并没有被正确移除。可能由于服务器连接中断或其他问题导致更新没有正确完成,但您可能会无限期地卡在“更新中”屏幕上。

    如何修复WordPress“另一个更新正在进行”错误
    当WordPress崩溃时,尝试找出导致问题的原因可能会非常令人沮丧。当问题几个小时都没有解决并阻止您使用网站的重要部分时,这尤其令人讨厌。

    您是否在更新页面上遇到奇怪的错误,阻止您升级WordPress核心甚至您的主题和插件?有时这个问题会自行解决,但如果你等了很长时间,仍然卡在这条消息上,它不太可能自行解决。

    让我们来看看为什么会发生这个问题,以及一些让您的网站再次运行的建议方法。

    1. 正在进行更新错误的原因
    2. 修复WordPress更新进行中错误的3种方法

    正在进行更新错误的原因

    当您的站点按预期工作时,转到仪表板 > 更新屏幕将显示您当前的WordPress版本。您还可以启动WordPress核心、主题或插件的更新。

    WordPress更新界面

    WordPress更新界面

    但是,如果您的网站最近更新了,您可能会注意到在您尝试更新或重新安装任何内容时,一条简短的消息已经接管或出现:“另一个更新正在进行中。”

    这将删除所有更新按钮并阻止您在页面上执行任何其他操作。

    WordPress更新进度页面

    WordPress更新进度页面

    如果您知道自己刚刚运行了更新,这实际上是为了防止您在下载更新时意外破坏您的网站。

    如果您没有自己启动更新,则可能是由自动更新功能引起的,或者您站点上具有高级权限的其他用户可能启动了更新过程。

    但是,虽然在更新运行时看到这个屏幕是正常的,但它连续几个小时呆在那里是不正常的。

    WordPress确实有意锁定您的数据库,但有时锁定并没有被正确移除。可能由于服务器连接中断或其他问题导致更新没有正确完成,但您可能会无限期地卡在“更新中”屏幕上。

    为什么核心更新会锁定WordPress数据库

    那么为什么会出现奇怪的信息呢?为什么WordPress会像这样故意阻止对更新屏幕的访问?

    每当WordPress运行核心更新时,它都会在数据库中添加一行,以防止任何其他更新(包括插件和主题更新)在更新期间运行,有时在完成后长达15分钟。安装更新是否需要5秒也没关系;更新仍将被阻止15分钟。

    这是有充分理由的。如果同时从两个不同的来源更新数据库表,则可能会导致数据库损坏和站点上的严重数据丢失。

    例如,如果您同时运行一个主题和一个核心更新,那么这两个操作最终可能会修改同一个数据库表并导致整个站点崩溃的可能性很小。

    此更新锁定可防止您或任何其他自动更新程序损坏您的网站和重要数据。

    这就是为什么建议您等待15分钟并且不要尝试手动移除锁定以运行第二次更新,因为这可能会产生严重后果。

    但是,如果您一直在等待并且您的更新页面没有自行修复,您将需要采取手动操作。(完成后,您可能需要查看我们的修复数据库表的指南,以防失败的更新破坏了任何东西)。

    修复WordPress更新进行中错误的3种方法

    在启动更新后大约15分钟内看到“更新中”消息是正常的,因此不要太快地跳到弄乱您的数据库。但是,如果您已经等了一段时间并且仍然看到错误,那么可能是时候自己采取进一步的措施了。

    在您第一次注意到该消息后至少等待一个小时,然后尝试其中一个步骤。永远记得在编辑后端文件之前备份您的数据库和整个站点,尤其是在您不熟悉该过程的情况下。

    如果这些步骤都不起作用,或者您只是不愿意自己修复它,您可以随时联系您的房东并寻求他们的帮助。

    使用插件

    通常解决此问题需要深入了解您的数据库或习惯使用高级开发人员工具(如WP-CLI),但如果您不想冒险破坏任何东西,可以使用更简单的选项。

    修复另一个正在进行的更新

    修复另一个正在进行的更新

    Fix Another Update In Progress完全符合它在锡上的指示。虽然它是一个很久没有更新的旧插件,但最近的评论表明它仍然可以正常工作(它的10k+活动安装证明了这一点)。

    也没有太多其他可用的替代方案,因此这是WordPress插件库中的最佳选择。但开发人员似乎不再支持它,因此使用它需要您自担风险。

    要安装它,请登录并转到插件> 安装插件。搜索“fix another update in progress”并单击以安装插件。

    您也可以手动下载插件,然后单击此页面上的上传插件。

    激活它后,您将在设置下看到一个标有Fix Another Update In Progress的新菜单。

    访问“Fix Another Update in Progress”设置

    访问“Fix Another Update in Progress”设置

    如果它检测到数据库中的锁定,它将显示此屏幕。只需单击Fix WordPress Update Lock按钮,数据库条目就会立即被删除。

    修复WordPress更新锁定按钮

    修复WordPress更新锁定按钮

    之后,您就可以开始使用了,您的“更新”页面应该可以再次使用了。将未使用的插件留在您的网站上并不是一个好主意,因此如果您没有看到此问题再次出现,您可以继续卸载它。

    使用PhpMyAdmin

    即使您以前从未深入研究过您的数据库,只要您不触及任何敏感设置,此解决方案也是一种相当简单且安全的解决方案。只需确保在接触数据库中的任何内容之前运行备份,并且只删除一个损坏的行。

    首先,您应该登录到PhpMyAdmin。

    在带有几个下拉菜单的左侧菜单中,打开您网站的数据库并选择wp_options

    在cPanel中访问wp_options

    在cPanel中访问wp_options

    单击wp_options后,您应该会看到一个包含各种数据库条目的表。您可能会在列表中看到它,或者您的表格可能太大了。如果找不到,请使用表格上方的过滤行栏并输入“ core_updater.lock ”直接跳转到它。

    现在只需单击“core_updater.lock”行上的删除。

    删除core_updater.lock行

    删除core_updater.lock行

    这样,您就可以自由地返回WordPress并再次更新您的网站。

    使用WP-CLI

    如果弄乱您的敏感数据库感觉有点不舒服,或者所有这些表让您感到不知所措,那么有一个快速简便的解决方案:WP-CLI。

    这是WordPress命令行界面,一种与您的数据库或站点的其他方面进行交互的方式,而无需通过cPanel和PhpMyAdmin手动导航。输入一行代码,你的问题立马解决。

    如今,许多WordPress主机已经安装了 WP-CLI,因此您无需进行任何困难的设置。

    与直接编辑数据库一样,您仍应在运行命令行之前备份您的站点。

    Windows用户需要安装像PuTTY这样的程序,而Mac和Linux用户已经内置了终端。

    下载PuTTY

    下载PuTTY

    您还需要从主机获取SSH凭据。您可能可以在SSH Access下的cPanel中找到它,或者您的服务器信息配置相关页面下找到它。

    Windows用户应安装PuTTY并输入主机提供的主机名/IP、端口、用户名和密码。

    Mac和Linux用户只需打开终端并输入以下命令:

    ssh username@hostip -p portnumber
    ssh username@hostip -p portnumber
    ssh username@hostip -p portnumber

    如果有提示,请输入密码。

    现在,无论您是在Windows上使用PuTTY还是在Mac或Linux上使用终端,您都应该能够将命令输入到您的服务器中。输入以下内容:

    wp option delete core_updater.lock
    wp option delete core_updater.lock
    wp option delete core_updater.lock

    在命令行中进行更改

    在命令行中进行更改

    到达那里有点困难,但是有了这个命令,你的问题就解决了。

    小结

    “另一个正在进行”更新错误在出现时可能会非常烦人。如果您最终连续几天无法更新您的网站,那么一个小的数据库错误可能会导致很多混乱。

    幸运的是,修复它是一项非常简单的任务。如果您有权访问WP-CLI或PhpMyAdmin,您只需删除锁定,您的网站就会恢复正常。如果您不习惯这样做,请安装一个可以为您处理它的插件。

    如果没有任何效果,您可以随时联系您的主机并要求他们自己删除损坏的数据库条目。

    请记住在尝试解决此问题之前15分钟到一个小时给出消息,因为它可能会在此之前自行解决。那个数据库锁被放在那里是有原因的,如果你在你应该删除它之前删除它,你可能会损坏你的数据库。

    WordPress错误很常见,当它们出现时知道该怎么做会很有帮助。

  • 如何解决413请求实体太大报错

    错误类型:
    HTTP错误
    错误名称:
    413 请求实体太大
    英文名称:
    413 Request Entity Too Large
    错误描述:
    413请求实体太大报错(413 Request Entity Too Large)这个报错不太多见,但并不代表它不存在。错误的本质非常清晰,即客户端所请求的实体,比如上传的文件超出限制所致。

    如何解决413请求实体太大报错

    WordPress错误有各种形式和大小。在大多数情况下,它们很容易破译。这就是WordPress错误报告的可访问性。即便如此,当“413 Request Entity Too Large”错误弹出时,它会让你摸不着头脑。

    在没有意识到的情况下,您已经拥有了理解和诊断其名称中的错误所需的一切。好消息是您只需要标准的安全文件传输协议 (SFTP)客户端和管理员访问您的服务器即可。

    在这篇文章中,我们将看看如何解决“413 Request Entity Too Large”错误。我们还将为您提供在开始解决错误之前要采取的步骤的快速列表,以使该过程超级简单。

    413请求实体太大报错

    413请求实体太大报错(413 Request Entity Too Large)这个报错不太多见,但并不代表它不存在。错误的本质非常清晰,即客户端所请求的实体,比如上传的文件超出限制所致。

    既然知道这个错误的问题所在,那么我们需要做哪些应对措施以修复此报错就非常简单了。

    这篇文章将详细说明该错误的本质及提出错误修复的解决方案:

    1. “413请求实体太大”错误是什么(以及它存在的原因)
    2. 解决“413请求实体太大”错误需要什么
    3. 在纠正“413 请求实体太大”错误之前可以采取的“准备步骤”
    4. 如何为您的WordPress网站解决“413 请求实体太大错误”

    什么是413 Request Entity Too Large

    413 Request Entity Too Large当从客户端作出的请求是过大,由Web服务器进行处理会出现误差。如果您的Web服务器设置了特定的HTTP请求大小限制,客户端可能会遇到413 Request Entity Too Large响应。可能导致此错误的示例请求是,如果客户端尝试将大文件上传到服务器(例如,大媒体文件)。

    它取决于您使用的Web服务器的类型,这将决定您需要配置哪个指令。无论您是要限制用户将过大的文件上传到您的Web服务器,还是要增加上传大小限制,以下部分将说明如何操作。

    我们注意到错误名称中有关于解决方案和问题的线索。不过,在你亲自调查之前,我们会破坏这个惊喜:它在形容词“大”中。

    简而言之,“413 Request Entity Too Large”错误是一个大小问题。当客户端发出的请求太大而最终服务器无法处理时,就会发生这种情况。根据错误的性质,服务器可以完全关闭连接以防止发出进一步的请求。

    让我们将错误分解为几个部分:

    • “413”:这是4xx错误代码之一,表示服务器和浏览器之间存在问题。
    • “请求实体”:在这种情况下,“实体”是客户端从服务器请求的信息负载。
    • “太大”:这很简单:实体比服务器愿意或能够服务的要大。

    实际上,此错误已将其名称从最初的名称更改为更具体并提供更多清晰度。它现在被称为“413 Payload Too Large”错误,尽管在实践中,您会更多地看到旧名称。

    至于为什么会出现错误,简单的解释是服务器设置为拒绝显式上传太大。想一想您上传文件时存在最大文件大小限制的情况:

    TinyPNG主页

    TinyPNG主页

    在大多数情况下,会进行一些验证来阻止错误……如果您看到“413 Request Entity Too Large”错误,那么这些验证工作可能不像您想象的那样无懈可击。

    修复414 Request-URI Too Large错误需要什么

    如果您过去遇到过413 Request Entity Too Large错误,您会发现类似的414错误。当然,这些名称显示了它们的相似之处,因为它们在官方标准中彼此相邻并且具有几乎相同的描述。

    鉴于此,您用于修复413的工具和技能列表也将与414相同:

    在纠正“413请求实体太大”错误之前可以采取的“准备步骤”

    在您打开工具箱之前,您可以采取一些步骤来帮助解决“413 Request Entity Too Large”错误。这里有两个——每个都可以为您提供一个受欢迎的解决方法。

    1.尝试通过SFTP将大文件上传到您的服务器

    因为这个问题与服务器的文件大小有关,所以最好绕过前端接口并自己将大文件上传到服务器。最好的方法是通过SFTP。

    这是因为就访问服务器的方式而言,诸如SFTP之类的协议几乎与您所能获得的一样“接近骨子里”。此外,您可以同时排除任何可能导致错误的前端问题。

    为此,请通过SFTP登录您的站点并找到wp-content文件夹。在这里将是上传文件夹。

    从SFTP客户端看到的上传文件夹

    从SFTP客户端看到的上传文件夹

    接下来,将你的文件上传到服务器上的这个文件夹,看看结果如何。如果上传成功,我们建议向网站的开发人员发送电子邮件,因为他们可能希望在前端进一步调查问题。

    2.检查服务器权限错误

    当然,权限错误会阻止任何服务器请求运行。因此,您应该检查用户是否有足够的权限上传任何大小的文件。排序后,错误应该消失。

    第一步是确定这是否是单个用户的问题(在这种情况下,他们可能由于某种原因受到限制)。如果多个用户出现“413 Request Entity Too Large”错误,您可以更加确定需要您输入的内容。

    我们在这里建议两个“预修复”:

    • 仔细检查您的WordPress文件权限,以防万一出现问题。
    • 删除并重新创建您的SFTP用户(一般调查是个好主意)。

    虽然他们可能无法在一开始就解决错误,但您至少会知道您的文件和用户结构是应有的。

    修复413 Request Entity Too Large错误

    完成前期步骤后,您就可以正面解决错误了。

    以下三种方法从最简单到最困难列出,理解为阻力最小的路径是最好的路径。

    1. 编辑您的WordPress functions.php文件

    首先,您可以使用您的functions.php文件来帮助增加您网站的文件上传大小。为此,首先使用主机控制面板中的凭据通过SFTP登录您的站点。

    当您进入时,您会想要查找文件本身。functions.php文件应该位于服务器的根目录中。在许多情况下,此根称为wwwpublic_html,或者它可能是您网站的缩写名称。

    找到它后,您可以在您选择的文本编辑器中打开它。如果您没有看到该文件,您可以使用文本编辑器创建它。

    打开文件后,输入以下内容:

    @ini_set( ‘_max_size’ , ’64M’ );
    @ini_set( ‘post_max_size’, ’64M’);
    @ini_set( ‘max_execution_time’, ‘300’ );
    @ini_set( ‘_max_size’ , ’64M’ );
    @ini_set( ‘post_max_size’, ’64M’);
    @ini_set( ‘max_execution_time’, ‘300’ );
    @ini_set( '_max_size' , '64M' );
    @ini_set( 'post_max_size', '64M');
    @ini_set( 'max_execution_time', '300' );

    简而言之,这增加了帖子和上传的最大文件大小,同时增加了服务器尝试处理请求的时间。这里的数字可以是你想要的任何数字,但它们应该足够大以使错误消失。实际上,除了最繁重的任务之外,64MB就足够了。

    functions.php文件

    functions.php文件

    准备好后,保存文件并再次将其上传到服务器。然后,检查“413 Request Entity Too Large”错误是否仍然存在。如果是这样,请转到下一个方法。

    2. 修改您的WordPress .htaccess文件

    就像您的functions.php文件一样,您的.htaccess文件位于您的服务器上。这里的区别在于.htaccessApache服务器的配置文件。

    不过,对于那些拥有Apache服务器的人来说,这是您需要的方法。与functions.php的指南非常相似,首先通过SFTP登录到您的服务器,然后像以前一样查看您的根文件夹。

    .htaccess文件应该在这个目录中,但如果它丢失了,我们建议您与您的主机联系以确定它在哪里,以及您的服务器是否在Nginx上运行。

    找到后,再次打开它。你会看到一些标签,这里最重要的是# END WordPress. 您需要在此行之后粘贴以下内容:

    php_value upload_max_filesize 64M
    php_value post_max_size 64M
    php_value max_execution_time 300
    php_value max_input_time 300
    php_value upload_max_filesize 64M
    php_value post_max_size 64M
    php_value max_execution_time 300
    php_value max_input_time 300
    php_value upload_max_filesize 64M
    php_value post_max_size 64M
    php_value max_execution_time 300
    php_value max_input_time 300

    简而言之,这与您添加到functions.php文件中的代码几乎相同,但它类似于向服务器提供直接指令。

    .htaccess文件

    .htaccess文件

    完成后,保存更改,上传文件,然后再次检查您的站点。如果您仍然遇到问题,我们再次建议您联系您的房东,因为他们需要验证您设置的某些方面,这些方面超出了本文的范围。

    此外,对于Apache Web服务器,有一个名为LimitRequestBody的类似指令。该指令提供的功能与client_max_body_size您能够限制HTTP请求的大小相同LimitRequestBody指令可以在您的http.conf文件或.htaccess文件中定义。Apache中此指令的默认值是0,但是,您可以将此值设置为您喜欢的任何值(该值以字节表示)。

    例如,如果您想限制大于100 MB的请求,您可以使用以下内容。

    LimitRequestBody 104857600
    LimitRequestBody 104857600
    LimitRequestBody 104857600

    完成更改后,保存配置文件并使用以下命令重新加载 Apache:

    service apache2 reload
    service apache2 reload
    service apache2 reload

    3. 改变你的Nginx服务器配置

    我们的最后一种方法是特定于Nginx服务器。目的与使用.htaccess文件时相同,因为您是在与服务器对话,而不是通过WordPress。

    我们提到对于Apache服务器,您将使用.htaccess。但是,对于Nginx服务器,您需要找到nginx.conf文件。我们没有引导您完成链中的每一步,而是在我们的问中详细介绍了更改WordPress最大上传大小

    根据您使用的Web服务器,实施下面描述的必要更改以配置您的Web服务器的最大HTTP请求大小限额。通过这样做,您可以设置允许客户端上传的阈值文件大小,如果超过该限制,他们将收到一个413 Request Entity Too Large状态。

    对于Nginx用户,决定允许的HTTP请求大小的指令是client_max_body_size. 该指令可能已经在您的nginx.conf文件(/etc/nginx/nginx.conf)中定义。但是,如果不是,您可以在http, server或者location块中添加该指令并定义一个值。

    server {
    client_max_body_size 100M;
    }
    server {
    client_max_body_size 100M;

    }
    server {
    client_max_body_size 100M;
    ...
    }

    该指令的默认值为1M(1 兆字节)。如果您不希望有请求大小限制,您可以将该值设置为0

    设置所需的值后,保存更改并通过运行以下命令重新加载Nginx:

    service nginx reload
    service nginx reload
    service nginx reload

    请记住,您还需要根据对nginx.conf所做的更改来更改php.ini文件。我们也在上述博客文章中介绍了这一点,因此请查看那里的确切步骤。

    附加配置 – PHP用户

    除了修改Web服务器上的相应指令外,PHP用户还需要进行一些其他更改。首先,您需要打开php.ini文件,该文件很可能位于类似于/etc/php5/fpm/php.ini(取决于您的PHP版本)的目录中。接下来,您需要找到并修改以下指令:

    • upload_max_filesize定义上传文件的最大允许大小(默认为 2 MB)。
    • post_max_size定义了PHP将接受的POST最大数据大小。此设置还会影响文件上传(默认为8MB)。

    一旦上述指令被修改,以反映所需的容许HTTP请求大小,简单地保存配置并重新加载PHP-FPM通过运行下面的命令:

    service php-fpm restart
    service php-fpm restart
    service php-fpm restart
  • 如何修复414 Request-URI Too Large错误

    错误类型:
    HTTP错误
    错误名称:
    请求URI太长
    英文名称:
    414 Request-URI Too Large
    错误描述:
    414 Request-URL Too Large错误是配置问题。它是400错误代码之一。这通常意味着您的浏览器和服务器之间的某个地方存在严重问题。

    如何修复414 Request-URI Too Large错误

    鉴于稳定的代码库,WordPress错误不会经常发生。更重要的是,当某些事情确实弹出来抑制你的一天时,它是明确的。其中之一是414 Request-URI Too Large错误,它可以准确地告诉您问题出在哪里。从那里,您可以尝试修复它。

    就像许多其他WordPress错误一样,您可以采取一些特定的步骤来解决它。简而言之,您需要调整一些配置设置以允许更长的URL。完成后,错误也会出现。

    在本文中,我们将向您介绍如何修复414 Request-URI Too Large错误。它将包括解决问题所需的工具和技能,并在深入了解之前列出一些“准备步骤”。

    1. 414 Request-URI Too Large错误是什么(以及为什么会发生)
    2. 修复414 Request-URI Too Large错误需要什么
    3. 开始解决414 Request-URI Too Large错误之前要做什么
    4. 如何修复414 Request-URI Too Large 错误

    414 Request-URI Too Large错误是什么(以及为什么会发生)

    414 Request-URL Too Large错误是配置问题。它是400错误代码之一。它们很麻烦,因为这通常意味着您的浏览器和服务器之间的某个地方存在严重问题。

    在这种情况下,414错误意味着URL太长,服务器无法处理,因此会引发异常。使用Urchin跟踪模块 (UTM) 代码跟踪转化时,这可能是一个问题。根据您设置的参数,这些链接可能会变长,如果它们达到站点配置的最大限制,您将看到错误。

    与许多WordPress错误一样,导致414的原因还有很多。事实上,您可以将原因分为三个不同的区域:

    • 使用过长的查询信息将POST请求转换为GET请求。这是在编码级别发生的特定于开发人员的问题。
    • 重定向循环。我们在上一篇文章中讨论了重定向的最佳实践。如果您进入重定向循环,则生成的URL会变得太长,并且会出现错误。
    • 服务器可能受到攻击,此时的414错误将是您最不担心的。

    在我们继续之前,值得注意的是,对于所有意图和目的,URI和URL是相同的东西。虽然两者之间有一些明显的区别,但我们将在这里使用“URL”来保持简单明了。

    修复414 Request-URI Too Large错误需要什么

    如果您过去遇到过413 Request Entity Too Large错误,您会发现类似的414错误。当然,这些名称显示了它们的相似之处,因为它们在官方标准中彼此相邻并且具有几乎相同的描述。

    鉴于此,您用于修复413的工具和技能列表也将与414相同:

    开始解决414 Request-URI Too Large错误之前要做什么

    在您打开服务器的引擎盖并将其设置为工作之前,您可能需要先执行一些“准备步骤”。可能有一个简单的解决方法,不需要您修改配置文件。

    更重要的是,无论如何都应该在某个时候进行这些检查,因此从长远来看,现在对它们进行处理将有所帮助。

    首先,WordPress插件可能会生成长URL作为其功能的一部分。功能齐全的一体化安全插件可能是这里的主要候选者,特别是如果它们提供了很多功能。

    很难一眼就知道插件是否有问题,但值得研究其特定设置,以找到限制URL长度的专用选项。如果是这样,切换它可以在几秒钟内解决414错误。

    但是,在正常情况下,您可以执行一些其他任务来帮助您诊断错误:

    • 检查您的服务器日志中是否提及错误或任何其他识别条目。
    • 您的浏览器开发工具可能会给您一些错误原因的指示——尤其是您的Console。
    • 联系网站所有者或开发人员(如果不是您),让他们知道错误的存在。他们可能会进行修复,或者可以进一步建议您该怎么做。

    当然,如果您发现插件有问题,您可能还是想联系网站和插件开发人员。即便如此,如果你已经用尽了所有的外展和顶级检查,那么是时候冒险了。

    如何修复414 Request-URI Too Large错误

    将工具放在一起后,您将需要一个计划。414 Request-URI Too Large错误的修复方法是更改​​服务器配置文件。因此,您可以采取三个步骤。

    让我们首先进入您的服务器并确定您拥有哪种类型的服务器。

    1.登录到您的服务器(并确定您的服务器类型)

    您必须先进入服务器,然后才能使用它,这就是您的SFTP技能发挥作用的地方。

    过去我们已经概述了如何通过SFTP进入您的站点,一旦您进入,您需要弄清楚您拥有的服务器类型。有两种主要类型:Apache和Nginx

    可能是您已经知道您运行的服务器类型。如果是这样,您可以跳到下一步。

    如果您遇到困难,这里有一个快速提示:查找.htaccess文件。它位于您服务器的根目录中,如果您能看到它,这意味着您正在运行一个Apache服务器。Nginx服务器使用不同的配置文件。

    也就是说,您可能正在运行一个还没有.htaccess文件的Apache服务器。因此,您可以使用其他两种方法:

    • 使用Whois域工具站点进行域查找:这可能会告诉您正在使用的服务器类型,尽管它不是一种万无一失的方法。
    • 请与您的托管服务提供商核实您使用的服务器类型。当然,您的主机会知道您运行的是什么服务器。

    当您确定使用哪种类型的服务器后,您可以进入下一步并找到您的配置文件。

    2. 找到服务器配置文件并在您的文本编辑器中打开它

    正如我们所指出的,Apache服务器使用.htaccess文件进行基本服务器配置,它将位于您的根目录中。不过,这不是您修复414 Request-URI Too Large错误所需的文件。

    在这种情况下,您需要深入了解您的高级配置设置。这些不在您站点的根文件夹中,而是在服务器的根文件夹中。

    当您通过SFTP登录您的站点时,您通常会进入一个包含所有站点(以及一些其他文件)的目录。在许多情况下,您可以升级到服务器根目录的几个级别:

    导航到Cyber​​duck中的服务器根目录

    导航到Cyber​​duck中的服务器根目录

    这将为您提供更多要遍历的目录。其中将是etc文件夹:

    服务器根目录中的etc文件夹

    服务器根目录中的etc文件夹

    配置文件的完整路径是/etc/apache2/apache2.conf

    Apache配置文件

    Apache配置文件

    对于Nginx服务器,过程类似。这是我们在关于调整WordPress中的最大上传大小的文章中部分介绍的内容。配置文件的路径是/etc/nginx/nginx.conf

    找到文件后,在您喜欢的文本编辑器中打开它。此时,您已准备好对其进行调整。

    3. 调整配置文件以允许更长的URL

    就像Apache和Nginx服务器有不同的配置文件一样,它们也有不同的设置需要调整。但是,无论您的服务器类型如何,如果您还没有这样做,则需要在编辑器中打开它。我们首选的方法是将文件下载到您的计算机,对其进行处理,然后将其上传回服务器。

    对于Apache配置文件,查找LimitRequestLine设置,如果不存在,则将其添加到文件底部:

    更改Apache服务器配置设置

    更改Apache服务器配置设置

    对于该值,请至少使用128000。如果您需要高于此值,请保持为2的倍数(即下一个值应为256000)。

    对于Nginx服务器,您正在寻找large_client_header_buffers设置。在这里,您将看到与数字和大小相关的两个值。例如,large_client_header_buffers 4 8K。 您需要在此处更改的唯一数字是大小 – 您可以从8K增加到大约128K,尽管您可能需要进一步增加(再次以2的倍数)。

    完成后,保存更改并将配置文件上传回服务器。此时,再次检查您的站点,414 Request-URI Too Large错误应该已经消失。

    小结

    WordPress错误通常有类似的解决方法。不过,您通常需要先诊断错误。在414 Request-URI Too Large错误的情况下,问题很明显:传递给服务器的URL太大。

    要修复它,您需要更改Apache或Nginx服务器设置。这不会花费太长时间,一旦完成,您应该重新启动并运行。

  • 如何修复解决“SSL握手失败”报错

    错误类型:
    安全相关错误
    错误名称:
    SSL握手错误
    英文名称:
    SSL Handshake Failed
    错误描述:
    SSL握手失败或错误525意味着服务器和浏览器无法建立安全连接。这可能由于多种原因而发生。

    如何修复解决“SSL握手失败”报错

    如今为网站设置安全套接字层 (SSL) 证书非常简单。您可以免费生成证书,许多托管服务提供商甚至会为您设置。但是,如果您没有正确配置您的证书,您可能会遇到诸如“SSL握手失败”之类的错误。

    如果您遇到“SSL握手失败”错误消息并且对它的含义感到困惑,那么您并不孤单。这是一个常见的错误,它本身并不能告诉你太多。虽然这可能是令人沮丧的体验,但好消息是您可以采取一些简单的步骤来解决问题。

    当您的浏览器和服务器无法建立安全连接时,会出现“SSL握手失败”错误。

    在这篇文章中,我们将解释什么是SSL Handshake Failed错误以及导致它的原因。然后,我们将为您提供几种可用于修复它的方法。

    1. SSL握手简介
    2. 了解导致SSL握手失败的原因
    3. 如何修复SSL握手失败错误

    SSL握手简介

    在我们深入研究导致TLS或SSL握手失败的原因之前,了解什么是TLS/SSL握手会很有帮助。安全套接字层 (SSL)传输层安全性 (TLS)是用于验证服务器和外部系统(如浏览器)之间的数据传输的协议。

    需要SSL证书才能使用HTTPS保护您的网站。我们不会太深入地讨论TLS与SSL之间的区别, 因为它是次要的。这些术语经常互换使用,因此为简单起见,我们将使用“SSL”来指代两者。

    除此之外,SSL握手是建立HTTPS连接过程的第一步。为了验证和建立连接,用户的浏览器和网站的服务器必须经过一系列检查(握手),从而建立HTTPS连接参数。

    让我们解释一下:客户端(通常是浏览器)向服务器发送安全连接请求。发送请求后,服务器会向您的计算机发送一个公钥,并根据证书列表检查该密钥。然后,计算机使用从服务器发送的公钥生成密钥并对其进行加密。

    长话短说,没有SSL握手,就不会建立安全连接。这会带来重大的安全风险。此外,该过程涉及许多活动部件。

    这意味着有很多不同的机会出现问题并导致握手失败,甚至导致“您的连接不是私密连接”错误,从而导致访问者离开。

    您可能知道,SSL证书可以验证您网站的“身份”。它使用浏览器检查的加密密钥来确保证书有效。建立连接后,您的浏览器可以解密服务器发送的内容。

    这个过程称为“握手”。以下是它更详细的工作原理:

    1. 您访问具有SSL证书的网站,并且您的浏览器发送数据请求。
    2. 服务器向浏览器发送一个加密的公钥。
    3. 您的浏览器检查该密钥并将其加密密钥发送回服务器。
    4. 服务器解密密钥并将加密内容发送回您的浏览器。
    5. 您的浏览器解密内容(从而完成握手)。

    所有这一切都在几秒钟内发生。SSL证书和HTTPS协议使您的网站能够安全地传输数据,而不会对性能产生负面影响。这使得SSL证书对任何网站都至关重要。但是,就像您网站的任何元素一样,它有时会产生独特的问题。

    了解导致SSL握手失败的原因

    SSL握手失败或错误525意味着服务器和浏览器无法建立安全连接。这可能由于多种原因而发生。

    通常,错误525表示使用Cloudflare的域与源Web服务器之间的SSL握手失败。

    “SSL握手失败”错误准确地告诉您问题是什么。当您的浏览器无法与具有SSL证书的网站建立连接时,它会显示:

    ssl-handshake-failed

    在这个来自使用Cloudflare的网站的示例中,您可以看到“SSL握手失败”错误对应于“525”代码。因此,错误可能源于服务器端和客户端的问题。

    但是,了解SSL错误可能发生在客户端服务器端也很重要。客户端SSL错误的常见原因包括:

    • 客户端设备上的错误日期或时间。
    • 浏览器配置错误。
    • 被第三方拦截的连接。

    一些服务器端原因包括:

    • 密码套件不匹配。
    • 服务器不支持的客户端使用的协议。
    • 不完整、无效或过期的证书。

    通常,如果SSL握手失败,问题可能是由于网站或服务器及其SSL配置有问题。

    该列表包括本地问题,与您网站的服务器相关问题,一个特定于第三方服务的问题。在接下来的部分中,我们将探讨如何解决每个问题。

    如何修复SSL握手失败错误

    “SSL握手失败”错误背后有几个潜在原因。因此,当涉及到如何修复它时,没有简单的答案。

    幸运的是,您可以使用一些方法来开始探索潜在问题并一一解决。让我们看一下可用于尝试修复SSL Handshake Failed错误的五种策略。

    1. 更新您的系统日期和时间
    2. 检查您的SSL证书是否有效
    3. 为您的浏览器配置最新的SSL/TLS协议支持
    4. 验证您的服务器是否已正确配置为支持SNI
    5. 确保密码套件匹配

    1. 更新您的系统日期和时间

    当您的浏览器尝试建立SSL握手时,它会根据您计算机的日期和时间验证证书。它这样做是为了验证SSL证书是否仍然有效。

    如果您本地设备的日期和时间关闭,则可能会导致验证过程中出现错误(即没有握手)。幸运的是,这是一个简单修复的问题。

    在Windows设备上,打开开始 菜单并输入日期和时间设置。选择出现的选项,会弹出一个新窗口。启用设置自动设置时间,并确保您的时区正确:

    set-time-automatically

    验证您的日期现在是否正确,然后尝试重新加载网站。

    以下是在其他操作系统 (OS) 上修复日期和时间的方法:

    如果在本地设备上修复日期和时间不起作用,您可以继续进行下一个修复。

    2. 检查您的SSL证书是否有效

    SSL证书上标有到期日期,以帮助确保其验证信息保持准确。通常,这些证书的有效期为六个月至两年。

    如果SSL证书被吊销或过期,浏览器将检测到这一点并且无法完成SSL握手。如果您在网站上安装SSL证书已经超过一年左右,那么可能是时候重新颁发它了。

    要查看SSL证书的状态,您可以使用SSL证书检查工具 ,例如Qualys提供的工具:

    Qualys网站上的SSL服务器测试工具

    Qualys网站上的SSL服务器测试工具

    该工具既可靠又免费使用。您需要做的就是在Hostname字段中输入您的域名 ,然后单击Submit。一旦检查器完成对您网站的SSL配置的分析,它将为您提供一些结果:

     

    Qualys SSL检查工具的结果页面

    Qualys SSL检查工具的结果页面

    在此页面上,您可以查看您的证书是否仍然有效,并查看它是否因任何原因被吊销。

    在任何一种情况下,更新您的SSL证书都应该可以解决握手错误(这对于确保您的网站和WooCommerce商店的安全至关重要)。

    3. 为您的浏览器配置最新的SSL/TLS协议支持

    有时,确定问题根本原因的最佳方法是消除过程。正如我们前面提到的,SSL握手失败通常是由于浏览器配置错误而发生的。

    确定特定浏览器是否存在问题的最快方法是尝试切换到其他浏览器。这至少可以帮助缩小问题范围。您也可以尝试禁用任何插件并将浏览器重置为默认设置。

    另一个潜在的与浏览器相关的问题是协议不匹配。例如,如果服务器仅支持TLS 1.2,但浏览器仅配置为TLS 1.0或TLS 1.1,则没有相互支持的协议可用。这将不可避免地导致SSL握手失败。

    如何检查此问题是否发生取决于您使用的浏览器。作为一个例子,我们将看看这个过程在Chrome中是如何工作的。首先,打开浏览器并转到设置 > 高级。这将扩展许多菜单选项。

    在“系统 ”部分下,单击“打开计算机的代理设置”

    Google Chrome中的系统设置页面

    Google Chrome中的系统设置页面

    这将打开一个新窗口。接下来,选择高级选项卡。在安全部分下,检查是否选中了使用TLS 1.2旁边的框 。如果没有,请检查该选项:

    Windows中的Internet属性高级设置

    Windows中的Internet属性高级设置

    还建议您取消选中SSL 2.0和SSL 3.0的复选框。

    这同样适用于TLS 1.0和TLS 1.1 ,因为它们正在被淘汰。完成后,单击“ 确定” 按钮,然后检查握手错误是否已解决。

    请注意,如果您使用的是Apple Safari或Mac OS,则没有启用或禁用SSL协议的选项。默认情况下会自动启用TLS 1.2。如果您使用的是Linux,您可以参考Red Hat guide on TLS hardening

    4. 验证您的服务器是否正确配置为支持SNI

    SSL 握手失败也可能是由不正确的服务器名称指示 (SNI) 配置引起的。SNI使Web服务器能够为一个IP地址安全地托管多个TLS证书。

    服务器上的每个网站都有自己的证书。但是,如果服务器未启用SNI,则可能导致SSL握手失败,因为服务器可能不知道要提供哪个证书。

    有几种方法可以检查网站是否需要SNI。一种选择是使用我们在上一节中讨论过的Qualys的SSL服务器测试。输入您网站的域名,然后单击提交按钮。

    在结果页面上,查找显示“This site works only in browsers with SNI support”的消息:

    Qualys SSL检查器工具的摘要结果页面

    Qualys SSL检查器工具的摘要结果页面

    另一种检测服务器是否使用SNI的方法是浏览“ClientHello”消息中的服务器名称。这是一个技术性更强的过程,但它可以提供很多信息。

    它涉及检查“server_name”字段的扩展hello标头,以查看是否提供了正确的证书。

    如果您熟悉使用OpenSSL工具包 和Wireshark等工具,您可能会发现此方法更可取。您可以使用openssl s_client或不使用该-servername选项:

    # without SNI
    $ openssl s_client -connect host:port
    # use SNI
    $ openssl s_client -connect host:port -servername host
    # without SNI
    $ openssl s_client -connect host:port
    # use SNI
    $ openssl s_client -connect host:port -servername host
    # without SNI
    $ openssl s_client -connect host:port 
    # use SNI
    $ openssl s_client -connect host:port -servername host

    如果您获得了两个同名的不同证书,则意味着SNI受支持且配置正确。

    但是,如果返回的证书中的输出不同,或者没有SNI的调用无法建立SSL连接,则表明需要SNI但未正确配置。解决此问题可能需要切换到专用IP地址。

    5. 确保密码套件匹配

    如果您仍然无法确定SSL握手失败的原因,则可能是由于密码套件不匹配。如果您不熟悉该术语,“密码套件”是指一组算法,包括用于密钥交换、批量加密和消息身份验证代码的算法,可用于保护SSL和TLS网络连接。

    如果服务器使用的密码套件不支持或不匹配Cloudflare使用的密码套件,则可能导致“SSL握手失败”错误。

    在确定是否存在密码套件不匹配时,Qualys的SSL服务器测试再次证明是一个有用的工具。

    当您输入您的域并单击提交时,您将看到一个摘要分析页面。您可以在“Cipher Suites ”部分下找到密码信息:

    Qualys SSL报告中的密码套件部分

    Qualys SSL报告中的密码套件部分

    您可以使用此页面来发现服务器支持的密码和协议。您需要注意任何显示“弱”状态的内容。此外,本节还详细介绍了密码套件的具体算法。

    要更正此问题,您可以使用您的浏览器工具的Qualys SSL/TLS功能将结果与您的浏览器支持的内容进行比较。有关密码套件的更多信息和指导,我们还建议查看ComodoSSLStore指南

    小结

    最令人困惑但最常见的SSL相关问题类型之一是“SSL握手失败”错误。处理此错误可能会带来压力,因为它有许多潜在原因,包括客户端和服务器端问题。

    但是,您可以使用一些可靠的解决方案来识别问题并加以解决。您可以使用以下五种方法来修复SSL Handshake Failed错误:

    1. 更新您的系统日期和时间。
    2. 检查您的SSL证书是否有效(必要时重新颁发)。
    3. 配置您的浏览器以支持最新的TLS/SSL版本。
    4. 验证您的服务器是否已正确配置为支持SNI。
    5. 确保密码套件匹配。
  • 如何修复Cloudflare报错Error 1020:访问被拒绝

    错误类型:
    安全相关错误
    错误名称:
    Error 1020: 访问被拒绝
    英文名称:
    Error 1020: Access Denied
    错误描述:
    当在受Cloudflare保护的站点上违反防火墙规则时,会导致错误1020访问被拒绝。如果站点访问者尝试直接访问受保护的端点,则可以触发它。

    如何修复Cloudflare报错Error 1020:访问被拒绝
    每逢网站报错,站长都会非常焦虑。但如果您了解报错背后发生的事情,则可以做到处事不惊,有效地去精准地解决问题。

    如果您的网站使用了Cloudflare,相信您对‘Error 1020: Access Denied’这样的报错信息不会陌生。本文将会对该错误进行详细的解释及给出详细的应对方案。

    1. 是什么导致了“Error 1020: Access Denied”
    2. 网站访问者
    3. 站点所有者或管理员非Cloudflare域
    4. 站点所有者或管理员Cloudflare域

    是什么导致了“Error 1020: Access Denied”

    当在受Cloudflare保护的站点上违反防火墙规则时,会导致错误1020访问被拒绝。如果站点访问者尝试直接访问受保护的端点,则可以触发它。

    如果您看到此问题,请查看以下信息以查看解决此问题的后续步骤。

    网站访问者

    如果您在访问网站时看到错误1020访问被拒绝,但您不是网站所有者或管理员,我们建议您联系网站所有者,以便他们解决问题。

    请务必包含错误的屏幕截图或至少包含错误下方显示的Cloudflare Ray ID。

     

    Cloudflare错误1020访问被拒绝

    Cloudflare错误1020访问被拒绝

    站点所有者或管理员非Cloudflare域

    如果您是站点所有者或管理员,并且没有自己的Cloudflare帐户并实施了防火墙规则,请联系服务器支持团队并提供以下信息,以便我们调查并解决此问题:

    1. 发生错误的日​​期和时间。
    2. 错误消息下方显示的Cloudflare Ray ID。
    3. 发生错误时您或您的访问者正在采取的任何步骤(例如单击链接、更新内容、将某些内容添加到购物车、提交表单或其他操作)。

    站点所有者或管理员Cloudflare域

    如果您是站点所有者或管理员,并且拥有自己的Cloudflare帐户并实施了防火墙规则,则需要检查防火墙事件日志(Firewall > Events)以查看违反了哪个规则并导致请求被阻止。

    如果您在防火墙事件日志中没有看到任何被阻止的事件,请联系服务器的支持团队并提供上面列出的信息(在非Cloudflare域部分中)。

  • 如何修复WordPress发生的max_execution_time致命错误

    错误类型:
    PHP错误
    错误名称:
    php提示超过x秒最长执行时间错误
    英文名称:
    max_execution_time
    错误描述:
    每个WordPress站点都有处理服务器请求的最大执行时间限制。它旨在最大程度地减少服务器滥用。此限制会查看您网站上运行的所有PHP脚本,并阻止那些运行超过时间限制的PHP脚本。

    如何修复WordPress发生的max_execution_time致命错误

    您偶尔会在WordPress中遇到错误或警告。您可能会遇到的这些错误之一是WordPress网站的max_execution_time致命错误。

    遇到这样的错误可能会让你失去平衡。这是一个好消息,因为这是一个常见错误。它不经常发生,但是当它发生时,有几个快速的解决方案。

    1. 什么是WordPress网站max_execution_time错误?
    2. 为什么会发生max_execution_time错误?
    3. 如何修复max_execution_time WordPress错误

    什么是WordPress网站max_execution_time错误?

    WordPress网站产生的max_execution_time致命错误在您的WordPress管理仪表盘中如下所示:

    仪表盘中的最大执行时间错误

    仪表盘中的最大执行时间错误

    整个错误消息如下:

    “Fatal Error: Maximum execution time of 30 seconds exceeded”
    “Fatal Error: Maximum execution time of 30 seconds exceeded”
    "Fatal Error: Maximum execution time of 30 seconds exceeded"
    

    30秒的值可以是任何数字。通常,它在30到60秒之间。安装或更新主题、插件或WordPress核心时,很容易弹出此错误。

    为什么会发生max_execution_time错误?

    每个WordPress站点都有处理服务器请求的最大执行时间限制。它旨在最大程度地减少服务器滥用。此限制会查看您网站上运行的所有PHP脚本,并阻止那些运行超过时间限制的PHP脚本。

    由于WordPress站点文件主要使用PHP,因此必须密切关注PHP脚本,以查看它们是否运行时间过长并占用过多服务器资源。恶意攻击利用永无止境的PHP脚本来使网站爬行的情况并不少见。

    此外,如果运行时间过长,某些插件、主题或其他WordPress元素可能会占用服务器资源。插件似乎比其他元素更频繁地触发此错误消息——可能是因为WordPress用户安装插件的频率高于他们修改代码或安装主题的频率。此外,插件来自各种开发人员,因此很难检查出由可靠代码和频繁更新支持的好插件。

    不管是什么原因,让PHP脚本运行很长时间的原因并不多。因此,设置了最长执行时间限制。您的托管公司通常在服务器级别设置此限制。

    标准最大执行时间限制是多少?

    大多数托管公司强制执行的最大执行时间在30到60秒之间。这个范围使您的PHP脚本有足够的时间来完成它们的工作,即使它们需要一些时间来执行。

    一般来说,30秒的时间限制应该适用于高质量的PHP脚本。但是,您可能需要将限制增加到60秒,具体取决于您的代码和服务器响应。一些开发人员可能会选择最多300秒,但任何超过此时间的决定都不是明智的决定。

    你可能想知道:有没有可能有一个网站,其中PHP脚本需要更长的时间,但它们不会对服务器造成任何损害?

    是的——一些资源密集型网站不得不达到更长的执行时间。但是,最好先假设可能是插件、主题或其他集成导致了问题,然后再得出不同的、不太有趣的结论。您的站点也可能需要更强大的服务器,尤其是在您当前使用共享主机设置的情况下。

    有时托管公司可能会为您的网站设置过低的最长执行时间。这是一种非常常见的情况,您可以通过联系您的托管服务提供商来解决它。

    “致命错误”:听起来很糟糕

    “致命错误”文本听起来很紧急,但您的网站不会面临永远无法再次运行的风险。max_execution_time这样的WordPress错误是WordPress中最常见的警告之一。

    但是,您可能会在网站的前端找到一条消息,告诉用户该网站遇到了技术问题。

    这是一个问题 – 如果警告消息阻止您的内容并在任何时间段内保持活动状态,您可能会失去销售、潜在客户或读者。

    如何确定是否发生WordPress max_execution_time错误

    查看您是否已超过最大执行时间的主要方法是在上传插件、主题或WordPress更新时检查仪表板中的消息。

    安装或更新页面呈现有关更改的信息,并为您提供“成功”或“失败”消息。“致命错误”消息也是一个选项。

    仪表盘内的致命错误消息

    仪表盘内的致命错误消息

    识别最大执行错误的另一种方法是查看向用户发送的前端消息,其中显示“该站点遇到技术困难”。

    关于技术问题的前端消息

    关于技术问题的前端消息

    此消息还有其他变体,其中一些讨论严重错误并包含一个了解调试的链接。

    较新WordPress版本上的替代前端消息

    较新WordPress版本上的替代前端消息

    最后,WordPress通常会向网站管理员发送一封电子邮件,说明插件或主题导致了致命错误。该电子邮件还将提供一个链接来帮助您找到问题的解决方案,通常是通过删除有问题的插件或主题或增加您的最长执行时间限制。

    一封来自WordPress关于如何修复最大执行错误的电子邮件

    一封来自WordPress关于如何修复最大执行错误的电子邮件

    对于所有导致“技术困难”消息的错误,请务必阅读我们的解决这些问题的指南。但是,要特别关注修复最大执行时间错误,请继续阅读。

    如何修复WordPress错误max_execution_time

    如前所述,WordPress错误max_execution_time出现在插件、主题或WordPress更新需要太长时间才能运行PHP脚本之后。

    您会在多个区域看到错误通知。如果您无法访问您的网站,您收到的致命错误电子邮件包含一个链接,用于在恢复模式下启动您的WordPress实例。

    恢复模式允许您访问仪表板并删除插件等问题

    恢复模式允许您访问仪表板并删除插件等问题

    有几种方法可以修复WordPress错误max_execution_time

    • 首先识别并卸载导致错误的插件、主题或其他资源。它是在恢复模式下完成的,或者通过FTP删除插件。
    • 通过插件增加WordPress仪表盘中的最大执行时间。
    • 在wp-config.php中修改最大执行时间。
    • 增加.htaccess文件中的最大执行时间。
    • 更改php.ini文件中的最大执行时间。
    • 要求您的托管服务提供商增加最大执行时间。

    卸载插件或主题通常是最快的方法,但我们将介绍以下所有选项。

    卸载问题项目

    此解决方案消除了最大执行错误,但不会增加最大执行时间。因此,如果您决定愿意为有问题的插件或主题寻找替代品,这只是一个合适的选择。

    如果您改为增加最大执行时间以为插件或主题留出空间,请转到以下部分。

    那些有兴趣删除问题项目(例如,主题或插件)的人,请按照以下说明进行操作。

    首先,请通过以下方法尽力确定问题出在哪里:

    • 卸载最近安装的项目,尤其是在安装插件或主题或更新到最新版本的WordPress后立即发生错误时。
    • 检查您的电子邮件收件箱以查看WordPress是否向您发送了有关致命错误的电子邮件。有时它们会首先包含有关哪个插件导致问题的信息。
    • 如果您不知道是哪个项目导致了错误,我们建议您停用每个插件,然后一个一个地重新激活它们,每次刷新以捕获哪个项目导致了错误。

    确定问题项目后,应从WordPress站点将其卸载。

    要完成此过程,请阅读我们关于卸载WordPress插件的文章。该指南重点介绍了如何使用仪表板、FTP客户端等删除插件。

    通过仪表板卸载最适合快速删除,但如果您无法访问WordPress仪表盘,则通过FTP卸载插件或主题会派上用场。您还可以选择使用恢复模式进入仪表盘。WordPress在您收到的电子邮件中包含一个指向恢复模式的链接。

    最后,您可能会发现最近的WordPress版本升级导致了该错误。使用我们关于如何回滚WordPress版本的指南来解决此问题。一般来说,WordPress版本不应该是根本原因——它通常是一个插件或主题与新的WordPress版本不兼容。

    如何增加WordPress的最大执行时间(使用插件)

    另一种选择是增加最大执行时间,让插件和主题中的PHP脚本有更多时间工作。

    同样,最大执行时间是为了您的站点和服务器的安全,所以最好不要增加它以适应编码不佳的插件或主题。但是,您可能会发现您的托管公司设置了较短的执行时间,或者您可能需要一些额外的时间。

    在这些情况下,增加最大执行时间以消除WordPress网站max_execution_time错误并最大限度地减少将来再次出现错误的机会是可以接受的。

    更改最大执行时间的一种方法是通过仪表板安装一个插件,该插件可以更改配置文件,而无需进入WordPress文件。对于那些不习惯使用FTP客户端的人,我们喜欢此选项,但前提是您可以访问该站点的仪表板。

    一些安全和优化插件,例如Google PageSpeed Insights,可以选择增加最大执行时间。

    另一个专注于最大执行时间的插件称为WP Maximum Execution Time Exceeded。我们建议尝试这个,因为它会自动重写.htaccess文件以增加最大限制。

    WP Maximum Execution Time Exceeded插件

    WP Maximum Execution Time Exceeded插件

    你无事可做;安装并激活插件以使其工作。

    您只需要安装和激活插件——仅此而已

    您只需要安装和激活插件——仅此而已

    默认情况下,该插件会提供300秒的延迟,而不是您最初拥有的任何延迟,这应该为您的网站的主题和插件提供足够的时间来运行它们的PHP脚本。

    最后,如果您想删除增加的时间限制,请卸载插件。

    如何在wp-config.php中增加最大执行时间

    以下每种方法都会利用您的核心WordPress文件。我们建议通过FTP/SFTP访问您的WordPress站点文件并修改其中的内容。

    至于处理WordPress网站的max_execution_time错误,解决问题的一种方法是打开wp-config.php文件。

    打开与WordPress文件的FTP连接。找到并打开根文件夹(通常以您的站点命名)并单击该/public文件夹。

    /public文件夹包含大量核心文件,包括wp-config.php

    单击wp-config.php可以直接在FTP客户端中进行编辑,也可以将其保存到您的计算机中进行编辑。

    找到wp-config文件

    找到wp-config文件

    将以下代码放入wp-congfig.php文件中:

    set_time_limit(300);
    set_time_limit(300);
    set_time_limit(300);

    只要不修改文件中已有的任何内容,代码的放置位置通常都无关紧要。我们建议在“停止编辑”之前找到最后一个区域并将代码放在那里。

    在wp-config中设置新的最大执行时间

    在wp-config中设置新的最大执行时间

    之后,保存并通过FTP将新的wp-config.php文件上传到您的站点。此示例的新最大执行时间为300秒,但您可以根据需要修改该数字。

    为确保它正常工作,请返回WordPress以查看现在是否一切正常。如果您尝试上传插件或主题时没有出现错误,则说明您已成功。

    如何增加 .htaccess 中的最大执行时间

    许多其他主机(主要是共享主机提供商)仍然使用Apache服务器,因此在您的根WordPress文件夹中提供了一个.htaccess文件。

    您可以像查找wp-config.php文件一样找到该文件:通过FTP连接到您的站点并在/public文件夹下查看。

    查找并单击 .htaccess

    查找并单击 .htaccess

    在编辑之前备份您的.htaccess文件非常重要。阅读本教程,了解如何备份WordPress文件。

    备份后,打开.htaccess文件进行编辑。

    将此行添加到文件中:

    php_value max_execution_time 300
    php_value max_execution_time 300
    php_value max_execution_time 300

    随意将数字更改为您想要的任何最大执行时间。请保存文件并将其上传回FTP客户端中的文件夹/public。最后,返回您的网站检查问题是否已解决。

    如何在php.ini中增加最大执行时间

    另一个在Web主机中不常见的文件称为php.ini。这是增加执行最大值的另一种选择,但通常情况下,使用wp-config.php方法会更轻松。

    但是,如果您确定根文件夹中存在php.ini文件并且其他方法由于某种原因不起作用,请考虑改用php.ini文件。

    与其他方法非常相似,您通常可以在/public文件夹中找到php.ini文件。通过FTP客户端访问它。

    打开该文件进行编辑。

    找到php.ini文件

    找到php.ini文件

    添加此行以增加最大执行时间:

    max_execution_time = 300
    max_execution_time = 300
    max_execution_time = 300

    与往常一样,更改数字以满足您自己的需求,并记住通过重新上传问题项目并检查所有错误消息是否已消失来测试它是否有效。

    联系您的托管服务提供商以请求增加最大执行时间

    在专用服务器上运行WordPress站点意味着您可以完全控制最长执行时间。因此,以前的方法应该有效。您还可能会发现您可以手动更改其他类型的托管(如托管或VPS托管)的最大执行时间。

    许多共享托管公司限制您修改最大执行时间限制的能力,以保护与许多其他应用程序和网站共享的整个服务器。

    如果您不想弄乱它,或者您无法增加最大执行时间,您必须联系您的托管服务提供商并要求他们为您增加它。

    联系服务器的支持团队,告诉他们您看到了WordPress网站遭遇max_execution_time错误。然后,询问您当前的最大执行时间是多少。最后,要求他们增加您的限制,最好是在60到300之间。请记住,您应该删除任何需要更长时间的插件或主题。

    小结

    WordPress发生max_execution_time错误是由于PHP脚本缓慢而发生的,通常出现在插件、主题和偶尔的WordPress版本更新中。

    您可能会在WordPress仪表盘中看到此错误,以及前端的潜在“技术问题”消息以及来自WordPress的有关情况的电子邮件。

    这是一个超级常见的错误。按照我们在此处介绍的步骤,您可以在几分钟内让您的网站再次正常运行。

  • 如何修复“HSTS Missing From HTTPS Server”错误

    错误类型:
    服务器错误
    错误名称:
    缺少HSTS
    英文名称:
    HSTS Missing From HTTPS Server
    错误描述:
    有时,IT安全扫描可能会报告您的站点“缺少HSTS”或“HTTP严格传输安全”标头。如果您遇到此错误,则说明您的网站未使用HSTS,这意味着您的HTTPS重定向可能会使您的访问者面临风险。

    如何修复“HSTS Missing From HTTPS Server”错误

    为HTTPS比HTTP安全得多。但是,如果您遇到“HSTS missing from HTTPS server”消息,那么此协议可能会使您的站点处于危险之中。

    幸运的是,可以堵住这个严重的安全漏洞。即使您没有遇到此错误消息,任何从HTTP重定向到HTTPS的站点都容易受到此漏洞的攻击。因此,采取积极主动的方法并修复此缺陷仍然是明智之举。

    在这篇文章中,我们将探讨“HSTS missing from HTTP server”错误是什么,以及为什么它对任何使用HTTPS重定向的网站来说都是一个如此严重的问题。然后,我们将通过五个简单的步骤向您展示如何解决此问题并阻止黑客。

    1. “HSTS missing from HTTP server”错误简介
    2. 如何修复“HSTS missing from HTTP server”错误

    “HSTS missing from HTTP server”错误简介

    为了帮助确保访问者的安全,网站执行HTTPS重定向的情况并不少见。此重定向将访问者从HTTP转发到网站的HTTPS版本。

    用户可以在其浏览器的地址栏中明确输入HTTP,或点击指向该站点HTTP版本的链接。在这些情况下,重定向可以防止恶意第三方窃取访问者的数据。

    然而,没有什么技术是完美的。如果您的站点确实使用HTTPS重定向,那么您可能容易受到称为安全套接字层 (SSL) 剥离的中间人 (MITM) 攻击。作为此攻击的一部分,黑客将阻止重定向请求并阻止浏览器通过HTTPS协议加载您的站点。结果,访问者将通过HTTP访问您的网站,这使黑客更容易窃取数据。

    或者,攻击者可能会拦截重定向并将访问者转发到您网站的克隆版本。此时,黑客可以窃取用户共享的任何数据,包括密码和支付信息。一些黑客还可能试图诱骗访问者下载恶意软件。

    黑客也有可能通过不安全的连接窃取会话cookie,这种攻击称为cookie劫持。这些cookie可以包含大量信息,包括用户名、密码,甚至信用卡详细信息。

    为了保护您的访问者免受这些攻击,我们建议启用HTTP严格传输安全 (HSTS)。此协议强制浏览器忽略任何直接请求并通过HTTPS加载您的站点。

    HSTS协议(以及您可能想要使用它的原因)

    HSTS是一个服务器指令和网络安全策略。由Internet工程任务组 (IETF) 在RFC 6797中指定,HSTS为用户代理和Web浏览器应如何处理通过HTTPS运行的站点的连接设置了规定。

    有时,IT安全扫描可能会报告您的站点“缺少HSTS”或“HTTP严格传输安全”标头。如果您遇到此错误,则说明您的网站未使用HSTS,这意味着您的HTTPS重定向可能会使您的访问者面临风险。

    这被归类为中等风险漏洞。然而,它非常普遍,对攻击者来说是唾手可得的成果。如果您遇到此错误,那么解决它至关重要。

    通过将HSTS安全标头添加到您的服务器,您可以强制您的站点加载HTTPS协议。这有助于保护您的网站免受cookie劫持和协议攻击。由于您可能会从加载过程中删除重定向,因此您的网站也可能加载得更快

    您可能没有遇到此错误,但仍然担心HSTS。如果您不确定是否启用了HSTS,您可以使用诸如Security Headers之类的工具扫描您的站点。只需输入您网站的URL,然后单击Scan

    使用Security Headers扫描您的站点

    使用Security Headers扫描您的站点

    安全标头将检查您的站点并在标头部分显示所有应用的标头。如果Strict-Transport-Security出现,则您的站点受到保护。但是,如果未列出此标头,那么我们还有一些工作要做。

    如何修复“HSTS Missing From HTTP Server”错误

    对于黑客来说,HSTS漏洞是窃取数据或诱骗访问者执行危险操作的绝佳机会。以下是启用HSTS政策并确保您的网站安全的方法。

    步骤 1:创建手动备份

    启用HSTS政策意味着您的网站发生了重大变化。因此,我们建议在继续之前创建按需备份。这使您可以选择在启用HSTS时遇到任何问题的情况下恢复您的站点。

    在宝塔面板,您可以设置WordPress备份计划。但是,在进行任何重大更改之前创建手动备份仍然是明智之举。要创建此安全网,请登录您的宝塔仪表盘。然后,单击左侧的“网站”菜单,找到你需要备份的网站对应的备份操作,然后在弹窗中点击“备份站点”。

    在宝塔面板执行网站备案操作

    在宝塔面板执行网站备案操作

    接下来,进行网站数据库备份,选择数据库菜单项。找到你需要备份的站点对应的数据库,点击备份列对应的操作项,然后单击弹窗的备份数据库按钮。

    备份网站数据库

    备份网站数据库

    这样,您即对网站完成了网站文件及数据库的备份操作。

    步骤 2:设置HTTP到HTTPS重定向

    在启用HSTS策略之前,您需要将SSL证书部署到您的网站。在宝塔面板,你可以直接申请部署证书。除非您特别需要自定义证书,否则您不必担心手动配置SSL。

    点击宝塔面板左侧的“网站”菜单项,然后找到你需要配置SSL的网站,点击操作项“设置”,点击弹窗左侧的“SSL”,然后根据需要申请及部署SSL,其中宝塔SSL和Let’s Encrypt的证书均免费,前者需要实名认证。

    然后你必须开启右上角的强制HTTPS,才可以实现将HTTP重定向至HTTPS。

    HTTP重定向至HTTPS

    请注意,如果您使用任何第三方代理或设置任何自定义HTTPS规则,那么强制HTTPS可能会导致错误或其他奇怪的行为。

    如果您的Web服务器正在运行Nginx,那么您可以将所有HTTP流量重定向到HTTPS。只需将以下代码添加到您的Nginx配置文件中:

    server {
    listen 80;
    server_name domain.com www.domain.com;
    return 301 https://domain.com$request_uri;
    }
    server {
    listen 80;
    server_name domain.com www.domain.com;
    return 301 https://domain.com$request_uri;
    }
    server {
    listen 80;
    server_name domain.com www.domain.com;
    return 301 https://domain.com$request_uri;
    }

    步骤 3:添加HSTS标头

    您可以将各种类型的指令和安全级别应用于HSTS标头。但是,我们建议添加max-age指令,因为它定义了Web服务器应通过HTTPS提供的时间(以秒为单位)。这会阻止访问只能通过HTTP提供的页面或子域。

    如果您使用的是Apache服务器,则需要打开您的虚拟主机文件。然后,您可以添加以下内容:

    Header always set Strict-Transport-Security max-age=31536000
    Header always set Strict-Transport-Security max-age=31536000
    Header always set Strict-Transport-Security max-age=31536000

    如果您使用的是NG服务器,那么您可以将以下内容添加到您的Nginx配置文件中:

    add_header Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
    add_header Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
    add_header Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

    与往常一样,我们可以为您完成所有艰苦的工作。只需打开支持票证,请求我们将HSTS标头添加到您的站点。我们的团队很乐意对您的Nginx文件进行此更改。

    步骤 4:将您的网站提交到HSTS预加载列表

    HSTS政策有一个主要缺点。浏览器必须至少遇到一次HSTS标头,然后才能将其用于将来的访问。这意味着您的受众将需要至少完成一次HTTP到HTTPS 重定向过程。在此期间,它们将容易受到基于协议的攻击。

    为了弥补这个安全漏洞,谷歌创建了HSTS预加载列表。这列出了所有支持HSTS的网站,然后将其硬编码到Chrome中。通过将您的站点添加到此列表中,访问者将不再需要完成初始HTTPS重定向。

    大多数主要的互联网浏览器都有自己的HSTS预加载列表,这些列表基于Chrome的列表。要获得此列表的资格,您的网站必须符合提交标准。好消息是我们已经涵盖了所有这些要求,因此您可以继续将您的网站提交到HSTS预加载列表。

    一旦您进入此列表,一些搜索引擎优化 (SEO) 工具可能会警告您有关307重定向。当有人试图通过不安全的HTTP协议访问您的站点时,就会发生这些重定向。这会触发307重定向而不是永久301重定向。如果您对此感到担忧,可以使用httpstatus扫描您的站点并验证是否发生 301 重定向。

    步骤 5. 验证您的Strict-Transport-Security标头

    添加HSTS标头后,最好测试它是否正常运行。您可以使用浏览器的内置 Web 工具执行此检查。

    这些步骤将根据您选择的Web浏览器而有所不同。要执行此操作,请检查Google Chrome DevTools,导航到您要测试的网页。然后,您可以单击任何空白区域,然后选择检查。

    闪电博主页

    闪电博主页

    在随后的面板中,选择Network选项卡。然后,您可以检查Headers部分,该部分应包含以下内容:

    strict-transport-security: max-age=31536000
    strict-transport-security: max-age=31536000
    strict-transport-security: max-age=31536000

    或者,您可以使用安全标头工具扫描您的站点。和以前一样,只需输入您网站的URL,然后单击Scan。这将返回一个安全报告,其中应包含一个strict-transport-security标签。如果此标记存在,那么您的HSTS标头现在已正确设置,并且您已成功关闭HTTPS重定向漏洞。

    小结

    从HTTP重定向到HTTPS是一种安全最佳实践。但是,没有任何技术是完美的,这种重定向可能会使您的网站更容易受到SSL攻击。

    考虑到这一点,让我们回顾一下如何修复“HSTS Missing From HTTPS Server”错误:

    1. 创建站点的手动备份。
    2. 设置HTTP到HTTPS重定向。
    3. 添加HSTS标头。
    4. 将您的网站提交到HSTS预加载列表。
    5. 验证您的strict-transport-security标头。
  • 如何修复Chrome中的ERR_CONNECTION_REFUSED错误

    错误类型:
    浏览器错误
    错误名称:
    连接被拒绝
    英文名称:
    ERR_CONNECTION_REFUSED
    错误描述:
    “ERR_CONNECTION_REFUSED”消息是一种特别常见且通常与WordPress网站无关的错误消息,您有时会在Chrome中看到。
    错误变体:
    Unable to connect
    Hmmm… can’t reach this page
    更多信息

    如何修复Chrome中的ERR_CONNECTION_REFUSED错误

    在一个沉迷于即时满足的数字世界中,您在浏览时最不想体验的事情之一就是错误消息,例如ERR_CONNECTION_REFUSED。这可能会令人难以置信地令人沮丧,甚至可能是出现严重问题的迹象。

    对于普通用户来说,真正令人困惑的错误是有时很难区分您的WordPress网站问题和其他问题,例如网络或浏览器问题。

    “ERR_CONNECTION_REFUSED”消息是一种特别常见且通常与WordPress网站无关的错误消息,您有时会在Chrome中看到。幸运的是,查明此问题的原因相对容易。在这篇文章中,我们将解释该消息的含义以及如何修复它。通常这涉及以下步骤:

    1. 检查页面本身是否已关闭。
    2. 重启你的路由器。
    3. 清除浏览器的缓存。
    4. 评估您的代理设置并根据需要进行调整。
    5. 暂时禁用防病毒和防火墙软件。
    6. 刷新您的DNS缓存。
    7. 更改您的DNS地址。
    8. 禁用任何过时的Chrome扩展程序。
    9. 重新安装Chrome浏览器。

    但首先,让我们更深入地了解这个错误的实际含义。

    1. 什么是ERR_CONNECTION_REFUSED错误?
    2. 如何修复Chrome中的ERR_CONNECTION_REFUSED错误
    3. 如果这些解决方案都不起作用怎么办

    什么是ERR_CONNECTION_REFUSED错误?

    不幸的是,遇到错误与使用互联网密切相关。有数百种可能性,从白屏死机经典的404错误ERR_CONNECTION_TIMED_OUT错误ERR_CACHE_MISS

    谷歌浏览器(无法访问此站点)

    在Google Chrome中,用户可能也熟悉ERR_CONNECTION_REFUSED页面。您将看到一条消息:

    无法访问此站点或此网页不可用。

    Google Chrome中的ERR_CONNECTION_REFUSED错误

    Google Chrome中的ERR_CONNECTION_REFUSED错误

    当您使用Google Chrome访问网站并遇到此消息时,这意味着您的连接尝试被拒绝。此错误代码也出现在其他浏览器中,尽管形式不同。

    此处也可能出现的类似消息是DNS_PROBE_FINISHED_NXDOMAIN错误,这是一个DNS错误,表示请求的域名不存在。

    Mozilla Firefox(无法连接错误)

    在Mozilla Firefox中,它只会显示为Unable to connect

    Firefox无法与domain.com上的服务器建立连接。

    Mozilla Firefox中的无法连接错误

    Mozilla Firefox中的无法连接错误

    Microsoft Edge(嗯……无法访问此页面错误)

    在Microsoft Edge中,它会简单地显示为Hmmm… can’t reach this page。这不是很有帮助。

    确保您拥有正确的网址:domain.com。

    Microsoft Edge的嗯……无法访问此页面错误

    Microsoft Edge的嗯……无法访问此页面错误

    ERR_CONNECTION_REFUSED错误有时是由服务器端问题引起的,而不是您个人尝试连接的问题。这通常并不严重,可能只是防火墙或服务器设置不正确的结果。但是,这也可能是更严重的问题出现问题的迹象——例如恶意软件攻击或意外停机。不可靠的互联网连接也会有所帮助。

    与大多数错误消息一样,ERR_CONNECTION_REFUSED让您知道出现了问题,而不会友好地告诉您为什么会发生。这意味着您可以找到并解决根本问题(如果可能)。

    如何修复Chrome中的ERR_CONNECTION_REFUSED错误

    尽管潜在原因的范围可能会使故障排除变得棘手,但可以修复ERR_CONNECTION_REFUSED错误。让我们从最有可能提供答案的步骤开始,介绍您可以采取的九个步骤。

    1. 检查网站状态

    您的第一个停靠点应该是检查您尝试访问的网站的状态。正如我们已经提到的,ERR_CONNECTION_REFUSED错误有时可能是由站点的服务器引起的,而不是您自己的Internet连接。

    检查是否是这种情况的一种简单方法是访问另一个网页。如果错误消息再次出现,则问题很可能源于您的连接。但是,如果第二个页面正确加载,则第一个站点可能有问题。

    您也可以使用Down For Everyone or Just Me

    Down For Everyone or Just Me网站

    Down For Everyone or Just Me网站

    输入无效页面的地址,然后单击or just me?. 然后,该站点将评估该页面是离线(Down)还是在线(Up)。不幸的是,当页面关闭时,您唯一能做的就是等待它被修复。但是,如果页面启动但仍未为您加载,则该进行一些进一步的故障排除了。

    2.重启你的路由器

    作为解决许多互联网相关问题的久经考验的方法,您的下一步将是尝试“将其关闭并重新打开”。重新启动您的家庭或办公室路由器并不能保证100%成功。但是,该过程只需几分钟,因此在处理潜在的连接问题时值得一试。

    为此,请断开路由器的电源。然后,您需要等待大约30秒,然后再重新插入。路由器再次启动后,尝试访问返回错误的页面。如果它加载,那么你很高兴去。如果没有,可能还有另一个原因在起作用。

    3.清除浏览器缓存

    与任何优秀的互联网浏览器一样,Chrome会将信息存储在您计算机或设备上的缓存中。这包括您的浏览历史记录、保存的登录数据和 cookie——所有这些都会被记录下来,以便在下次访问时更快地加载相关页面。

    尽管它们很有用,但缓存过时会导致许多问题。这是因为页面的缓存版本可能不再匹配当前的实时版本。幸运的是,通过清除缓存可以轻松解决此问题。

    但在此之前,您可以先以隐身模式打开浏览器,轻松检查是否是浏览器缓存问题。或者您可以尝试其他浏览器。如果您仍然看到错误,那么您将需要继续清除缓存。

    为此,首先打开Chrome的主菜单(在浏览器窗口的右上角)。从那里,选择更多工具:然后您可以单击清除浏览器数据

    Chrome清除浏览数据

    Chrome清除浏览数据

    在结果页面上,您需要确保选择了所有列出的文件类别。否则,Chrome将无法清空整个缓存。相反,它只会删除最近的条目,这不会产生预期的效果:

    清除浏览数据

    清除浏览数据

    完成此过程的另一种方法是在地址栏中输入以下URL:

    chrome://settings/clearBrowserData
    chrome://settings/clearBrowserData
    chrome://settings/clearBrowserData

    生成的屏幕应授予您访问我们上面概述的相同选项的权限。以下是清除缓存的其他一些有用链接。

    4. 评估您的代理设置并根据需要进行调整

    随着安全威胁的不断增加,难怪许多人现在正在使用单独的解决方案来保护他们的敏感数据。一种流行的方法是使用代理服务器。

    代理可让您在不同的 IP 地址下上网,并充当您的浏览器和您访问的网站之间的中介。除了保持您的IP地址私密外,它还有助于过滤缓存数据和服务器通信。

    就像缓存一样,代理服务器可能很有用,但它也可能导致ERR_CONNECTION_REFUSED消息。例如,Web服务器可能会拒绝附加到代理服务器的IP地址,然后因此拒绝实际连接。

    代理也可能处于脱机状态或配置不正确。简而言之,如果出现有问题的错误消息,则值得检查您的代理设置。

    Chrome实际上有自己的代理部分,可以使这一步成为一个特别简单的过程。毕竟,您无需花费任何时间在浏览器中搜索正确的工具。

    要开始使用,请访问Chrome浏览器中的“设置”菜单。这将打开完整的选项菜单。在“系统”部分下(您需要单击底部的“高级”才能看到),您应该找到一个标题为“打开代理设置”的条目。通过选择它,您将被带到相应的菜单:

    在Chrome中打开代理设置

    在Chrome中打开代理设置

    您的下一步取决于您当前使用的系统。Windows用户需要单击LAN Settings,然后取消选中Use proxy server for LAN选项。如果您是Mac用户,您应该立即在相关菜单中找到自己。然后,您必须取消选中所有可选择的代理协议,并检查 ERR_CONNECTION_REFUSED 消息是否已解决。

    在Mac上取消选中代理

    在Mac上取消选中代理

    5. 暂时禁用防火墙和杀毒软件

    防火墙和防病毒软件旨在保护用户及其系统。他们会定期扫描您的设备,并自动阻止任何可疑活动。但是,您可能会开始注意到这里反复出现的主题,因为(很像缓存和代理服务器)这种类型的高级安全性有时会导致连接问题。

    这是因为防火墙通常可以阻止他们不需要的页面,或者拒绝完全安全的内容。要检查您是否属于这种情况,请尝试禁用防火墙和防病毒程序。当然,只有在您确定要访问的站点是安全的情况下才建议这样做。

    此外,您应该只暂时禁用此类软件。完成检查以查看错误是否已解决后重新打开它,这样您就不会容易受到攻击。如果您因为防火墙或防病毒软件而反复遇到错误,您可能需要考虑更改您正在使用的软件。

    6. 清除你的DNS缓存

    作为对早期故障排除步骤的某种扩展,您的下一个任务将是清除DNS缓存。尽管大多数人都知道他们的浏览器会创建缓存,但知道他们的操作系统做同样事情的人并不多。

    例如,您的DNS缓存包含您使用浏览器访问过的页面的所有临时条目。这些条目存储与您访问过的页面的域名和地址相关的关键信息。

     

     

    此功能的目的类似于其他类型的缓存。它加速了加载过程,因为它消除了重复联系站点的DNS服务器的需要。从长远来看,这将节省您的时间。但是,您可能偶尔会看到一些短期问题。

    如果存储的条目不再与它所引用的网站的当前版本匹配,则诸如ERR_CONNECTION_REFUSED消息之类的技术错误并不少见。幸运的是,清除DNS缓存是一种快速简便的解决方案。

    同样,您将如何执行此操作将取决于您的操作系统。

    Windows

    按Windows键启动开始菜单并搜索“CMD”。这应该返回命令提示符。

    Windows中的命令提示符

    Windows中的命令提示符

    在命令提示符下运行以下命令:

    ipconfig /flushdns
    ipconfig /flushdns
    ipconfig /flushdns

    ipconfig /flushdns

    ipconfig /flushdns

    然后,您将看到它已成功刷新DNS解析器缓存的确认信息。

    刷新的DNS解析器缓存

    刷新的DNS解析器缓存

    出于本文的目的,我们将在您使用 Mac 时向您介绍整个过程——尽管如果您是Windows粉丝,您将能够在线找到大量有用的资源。

    Mac

    在Mac上,您需要执行以下操作:

    单击工具栏中的“Go”,然后单击“Utilities”。(Shift-Command-U)

    Mac实用程序

    Mac实用程序

    打开终端。

    Mac终端

    Mac终端

    运行以下命令。您需要管理员权限才能执行此操作。

    sudo killall -HUP mDNSResponder && echo macOS DNS Cache Reset
    sudo killall -HUP mDNSResponder && echo macOS DNS Cache Reset
    sudo killall -HUP mDNSResponder && echo macOS DNS Cache Reset

    清除Mac的DNS缓存

    清除Mac的DNS缓存

    完成后,再次尝试访问问题站点。希望,如果你已经听从了我们所有的建议,它现在应该可以工作了。如果没有,您的DNS可能需要更多注意。

    7. 更改您的DNS地址

    正如我们上面所讨论的,过时的DNS缓存条目是ERR_CONNECTION_REFUSED消息等问题的潜在来源。但是,DNS地址本身也可能导致此类问题。这是因为它经常会变得超载,甚至完全脱机。

    在大多数情况下,您的DNS服务器地址会自动从您的互联网提供商处获取。但是,如果需要,您也可以更改它。您将如何执行此操作将再次取决于您使用的操作系统。

    让我们探索一下Mac用户如何完成这个过程。首先,您需要打开System Preferences。在出现的屏幕上,选择标记为Network的选项。然后,您需要单击Advanced

    Mac网络高级设置

    Mac网络高级设置

    从那里,选择屏幕顶部的DNS选项。要添加新的DNS服务器,请单击+按钮。要改为编辑现有DNS服务器,请双击您要调整的DNS IP地址:

    网络DNS

    网络DNS

    您可以尝试将这些临时更改为公共DNS服务器,例如Google或Cloudflare。

    • 有些人更喜欢  长期使用Google的公共DNS(8.8.8.8 和 8.8.4.4),因为它们有时更可靠。
    • Cloudflare还提供其安全且快速的免费DNS(1.1.1.1和1.0.0.1)。

    提示:如果您已经在使用免费的DNS服务器并且遇到问题,将其删除并默认返回到您的ISP的DNS服务器有时也可以解决问题。Google和Cloudflare并非100%完美,在某些情况下,我们注意到切换回来已经解决了这个问题。

    然后,您可以尝试再次访问该站点——然后用手指交叉。

    8.禁用任何Chrome扩展

    不可否认,安装扩展程序通常有助于获得更全面的Google Chrome浏览器体验。提供的许多扩展可以添加关键功能,甚至有助于自动化复杂的流程。

    然而,大量可用于Google Chrome的扩展程序并不是由浏览器的开发人员开发的。相反,它们通常由第三方创建。这可能意味着无法真正保证它们会按您的预期工作,或者它们会随着时间的推移而正确更新。

    不正确或过时的扩展可能会导致许多问题——包括ERR_CONNECTION_REFUSED错误消息。因此,定期审核附加到浏览器的扩展非常重要。

    为此,首先在Chrome浏览器中打开扩展菜单。然后,您可以开始依次评估每个已安装的扩展。首先询问您是否真的需要每一个。如果不再需要扩展,您只需将其删除即可。

    接下来,找出您要保留的每个扩展程序的最后更新时间。理想情况下,它应该在过去三个月内更新。任何比这更长的时间都可能表明该扩展被其开发人员所忽视。如果可能,您将希望删除这些扩展并用更新的替代品替换它们。

    当然,新的(和完全更新的)扩展有时仍然会导致问题。如果您怀疑是这种情况,请首先禁用所有附加的扩展程序。如果您尝试访问的站点在执行此操作后加载,您就会知道其中至少有一个有问题。然后,您可以一次重新激活一个扩展程序,直到您熟悉问题软件。

    9.重新安装Chrome浏览器

    与任何其他应用程序一样,Chrome本身永远不会完全没有错误。您安装的浏览器可能包含各种问题,尤其是在一段时间未更新的情况下。更重要的是,您的浏览器和操作系统之间的问题非常普遍。

    因此,有时唯一的解决方案是完全重新安装Chrome。您可以通过从设备中删除当前安装来执行此操作。然后,您可以通过访问Chrome官方网站下载最新版本的浏览器。

    如果这些解决方案都不起作用怎么办

    如果我们为您提供的解决方案都没有修复ERR_CONNECTION_REFUSED消息,这通常表明服务器端出现了更严重的问题(换句话说,就是网站本身)。

    不幸的是,在这种情况下,您唯一能做的就是耐心等待。该网站的所有者很可能正在努力解决任何问题,并且很快就会恢复正常营业。

     

     

    如果访问该站点是紧急事项,您可以尝试直接与其所有者联系。有很多方法可以做到这一点,尽管社交媒体和电子邮件特别有效——而且不太可能受到任何网站停机时间的影响。

    解释您面临的问题,并提及您尝试了多种解决方案均无济于事。希望网站背后的团队能够与您联系并讨论最佳行动方案。如果您碰巧让他们意识到他们不知道阻止访问他们的网站的问题,您甚至可能是在帮他们一个忙。

    小结

    尽管连接错误总是令人沮丧,但重要的是要记住它们通常可以修复。您的第一个呼叫端口应该始终是检查问题是否出在网页本身。另一方面,如果问题出在您自己的连接上,则您需要做一些工作才能让事情恢复正常运行。

    要尝试解决ERR_CONNECTION_REFUSED消息,您可以:

    1. 检查页面本身是否已关闭。
    2. 重启你的路由器。
    3. 清除浏览器的缓存。
    4. 评估您的代理设置并根据需要进行调整。
    5. 暂时禁用防病毒和防火墙软件。
    6. 刷新您的DNS缓存。
    7. 更改您的DNS地址。
    8. 禁用任何过时的Chrome扩展程序。
    9. 重新安装Chrome浏览器。
  • 如何修复“ERR_CONNECTION_RESET”错误

    错误类型:
    浏览器错误
    错误名称:
    连接已重置
    英文名称:
    ERR_CONNECTION_RESET
    错误描述:
    要访问一个网站,您的浏览器需要与它建立连接。浏览器发送请求,如果得到响应,则开始接收和发送信息。在某些情况下,该连接可能无法建立,您会遇到“ERR_CONNECTION_RESET”错误。
    错误变体:
    The connection was reset
    更多信息

    如何修复“ERR_CONNECTION_RESET”错误

    要访问一个网站,您的浏览器需要与它建立连接。浏览器发送请求,如果得到响应,则开始接收和发送信息。该信息变成了一个网页,就像您现在看到的那样。

    但是,在某些情况下,该连接可能无法建立,您会遇到“ERR_CONNECTION_RESET”错误。

    出现此问题的原因有多种。幸运的是,如果您了解错误的潜在原因,您应该能够在几分钟内对其进行故障排除。

    在本文中,我们将讨论导致“ERR_CONNECTION_RESET”错误出现的原因。然后,我们将向您展示如何迅速解决它。

    1. 是什么导致“ERR_CONNECTION_RESET”错误?
    2. 如何修复“ERR_CONNECTION_RESET”错误(5 种方法)

    是什么导致“ERR_CONNECTION_RESET”错误?

    “ERR_CONNECTION_RESET”错误代码是谷歌浏览器特有的。但是,您可能会在其他浏览器中遇到类似的消息。例如,Firefox返回“The connection was reset”错误代码。

    访问网站时出现连接重置错误,浏览器无法建立连接。发生这种情况时,连接将“重置”,这意味着服务器无法将数据传输到您的浏览器。

    以下是Chrome中“ERR_CONNECTION_RESET”消息的样子:

    Chrome中的“ERR_CONNECTION_RESET”错误

    Chrome中的“ERR_CONNECTION_RESET”错误

    在大多数情况下,此错误表明您的Internet连接存在问题,例如:

    好消息是,解决任何这些问题都非常容易。我们将在以下几节中按顺序向您展示如何对它们中的每一个进行故障排除。

    如何修复“ERR_CONNECTION_RESET”错误(5 种方法)

    如果遇到“ERR_CONNECTION_RESET”错误,您要做的第一件事是确定您的互联网连接是否正常工作。

    要开始使用,请尝试访问其他一些网站以查看它们是否正确加载。

    但是,即使它们确实加载了,我们还是建议您通过断开电源线、等待一分钟然后重新连接来重置路由器。您的连接应该会在几分钟内再次可用。

    启动后,您可以检查错误是否仍然存在。如果这不能解决问题,是时候开始执行以下故障排除步骤了。

    1. 检查您的VPN

    如果您出于工作或隐私原因使用VPN,重要的是要知道您与它的连接可能会断开。发生这种情况时,您可能无法与某些网站建立连接,直到它恢复。

    根据您使用的VPN软件,它可能会尝试自动重新连接,或者您可能必须手动重新连接。某些软件还为您提供了在尝试重新连接到网络时阻止导航的选项:

     

    OpenVPN软件

    OpenVPN软件

     

    如果您使用VPN工作,您尝试访问的网站可能会在您使用无法识别的IP地址时阻止或重置连接。如果是这种情况,重新连接到VPN应该可以解决问题。

    2.重置您的TCP/IP设置

    如果手动重置浏览器不起作用,您可以强制操作系统 (OS) 更新TCP和IP协议设置。这将使您的互联网连接恢复到其默认设置,并且在此过程中,它可以修复“ERR_CONNECTION_RESET”错误。

    如何在Windows中重置TCP/IP设置

    如果您使用的是Windows,则可以通过命令行重置和更新TCP/IP设置。

    为此,请单击“开始”按钮,输入“cmd”(不带引号),然后按Enter。你会看到一个像这样的窗口:

     

    Windows中的命令提示符

    Windows中的命令提示符

     

    现在继续,一一输入以下命令。每一行都是一个不同的命令——所以输入一个,按Enter,然后继续下一个:

    Netsh winsock reset
    Netsh int ip reset
    Ipconfig /release
    ip/config /renew
    Ipconfig /flushdns
    Netsh winsock reset
    Netsh int ip reset
    Ipconfig /release
    ip/config /renew
    Ipconfig /flushdns
    Netsh winsock reset
    Netsh int ip reset
    Ipconfig /release
    ip/config /renew
    Ipconfig /flushdns

    除了重置您的互联网连接外,最后一个命令还将刷新您的本地域名系统 (DNS) 缓存。过时的缓存会导致连接错误,因此这个附加命令可以派上用场。

    一旦您的互联网连接再次启动,请尝试访问返回“ERR_CONNECTION_RESET”错误的网站。如果它仍然存在,请继续进行下一个修复。

    如何在macOS中重置TCP/IP设置

    在macOS上重置TCP/IP设置非常简单——只需几个步骤即可完成:

    1. 转到系统偏好设置并选择网络选项。
    2. 选择您的活动互联网连接并打开其高级设置。
    3. 转到TCP/IP选项卡。
    4. 单击更新DHCP租约

    重置TCP/IP设置后,尝试访问之前显示“ERR_CONNECTION_RESET”错误的网站。如果您的互联网连接有问题,则错误应该消失了。

    3.禁用您的防病毒软件和防火墙

    在保护您在网络上时,防病毒和防火墙可能非常激进。在某些情况下,您的防病毒软件可能会阻止您下载和打开文件,或者完全阻止您访问网站。

    这同样适用于您的防火墙,它可能会在您尝试访问特定站点时重置您的连接。

    排除防火墙的最佳方法是暂时禁用它,然后检查“ERR_CONNECTION_RESET”错误是否仍然存在。以下是在任一操作系统中执行此操作的方法:

    1. 禁用Windows防火墙
    2. 禁用macOS防火墙

    如果您的防病毒软件阻止与远程服务器的连接,您也必须手动禁用它。该过程将根据您使用的程序而有所不同,因此您需要检查其文档。

    根据我们的经验,您的防火墙或防病毒软件很少会重置连接。如果您尝试访问不安全的网站,您的浏览器很可能会向您显示警告。但是,如果到目前为止您已经尝试了所有其他修复,那么值得禁用这两组软件以排除它们作为原因。

    4.清除浏览器缓存

    您的浏览器会存储您访问的大多数网站的数据,因此在您返回时无需从头开始重新加载它们。在某些情况下,过时的缓存文件可能会导致加载网站时出现错误,例如“ERR_CONNECTION_RESET”。

    如果是这种情况,您可以通过清空浏览器缓存来解决问题。无论您使用什么浏览器,该过程的工作原理都相同。

    例如,如果您使用Chrome,您可以转到设置 > 隐私和安全 > 清除浏览数据,然后勾选缓存图像和文件选项:

     

    清除Chrome中的缓存

    清除Chrome中的缓存

     

    单击清除数据并等待Chrome删除缓存的文件。

    该过程不会花费很长时间,一旦完成,您可以尝试重新加载出现“ERR_CONNECTION_RESET”错误的页面。

    此过程也适用于非Chrome浏览器。在其他浏览器中清除缓存的步骤非常相似。

    5.禁用您的代理服务器

    如果您通过代理服务器路由连接,则在尝试加载网站时可能会导致错误,例如“ERR_CONNECTION_RESET”。这可能是因为代理服务器无法建立与网站的连接,或者是因为您一开始就无法连接到代理服务器。

    无论如何,除非您出于特定原因使用代理服务器,否则您可以继续禁用它。

    如果您使用的是Windows,您可以打开“开始”菜单,输入“Internet选项”(不带引号),然后选择出现的选项。

    将打开一个名为Internet属性的窗口。转到连接选项卡并选择局域网设置选项:

     

    修改您的Windows互联网设置

    修改您的Windows互联网设置

     

    在下一个窗口中,查找选项:为LAN使用代理服务器。如果启用了该设置,请将其关闭并检查自动检测设置选项

     

    禁用代理服务器

    禁用代理服务器

     

    点击确定,就是这样。您可以继续尝试访问返回“ERR_CONNECTION_RESET”错误的网站。如果您已经尝试过其他所有方法,这应该可以解决问题。

    小结

    如果您遇到“ERR_CONNECTION_RESET”错误,这意味着您的浏览器无法与远程服务器建立连接。在大多数情况下,这是由于您的 Internet 设置中的错误配置或其他阻止连接的原因。

    根据您的情况导致“ERR_CONNECTION_RESET”错误的原因,您可以通过五种方法来修复它:

    1. 检查您的VPN。
    2. 重置您的TCP/IP设置。
    3. 禁用防病毒和防火墙。
    4. 清除浏览器缓存。
    5. 禁用您的代理服务器。