解决nginx反向代理中上游服务器down了导致整个nginx出错问题

当 upstream 中的所有上游服务器都标记为 down 时,Nginx 在默认配置下会返回 502 Bad Gateway 错误。这是因为 Nginx 无法找到可用的上游服务器来处理请求。

如果你想要在没有可用上游服务器时提供一个默认的页面或执行其他操作,你可以使用 proxy_intercept_errors 指令。这个指令可以用来拦截代理模块返回的错误,并根据需要处理这些错误。

以下是一个简单的配置示例:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        # ...
    }

    server {
        location / {
            proxy_pass http://backend;
            proxy_intercept_errors on;
            error_page 502 =200 /fallback; # 将502错误映射到/fallback地址
            # 其他代理相关的配置
        }

        location = /fallback {
            # 处理没有可用上游服务器时的情况
            # 例如,返回一个友好的错误页面
            return 503 'No available upstream server';
        }
    }
}

在这个配置中:

proxy_intercept_errors on; 启用了错误拦截。
error_page 502 =200 /fallback; 将 502 错误映射到 /fallback 地址。这里的 =200 是为了将 HTTP 状态码修改为 200,以便 Nginx 会继续处理请求。
location = /fallback { ... } 处理没有可用上游服务器时的情况。在这里,我简单地返回了一个 503 状态码和一条文本消息,你可以根据需要自定义。
请注意,这样的处理会将 502 错误映射为一个 200 OK 响应,并通过 /fallback 地址处理。这可能不是 HTTP 规范建议的最佳做法,但在某些情况下可能是有用的。你可以根据实际需求进行调整。

来源:ChatGPT

安卓NFC手机复制非加密门禁卡

说明

此文仅讨论复制非加密门禁卡,并不是通过手机模拟非加密门禁卡

硬件准备

  1. 支持NFC功能的安卓手机
  2. 空白CUID卡/锁匙扣

软件准备

  1. 安卓手机安装MIFARE Classic Tool

操作

  1. 把原来的门禁卡放到NFC手机的背面。
  2. 通过MIFARE Classic Tool软件里面的READ TAG,把原门禁卡的数据提取出来,保存。
  3. 把新门禁卡放到NFC手机的背面。
  4. 在MIFARE Classic Tool选择WRITE TAG,然后选择Write Dump(Clone),选择原门禁卡的数据,进行复制
  5. 经过上一步,新门禁卡的0扇区并没有改变
  6. 复制原门禁卡0扇区的数据
  7. 在MIFARE Classic Tool选择WRITE TAG,然后选择Write BlockSector填入0Block填入0Data填入复制的原门禁卡0扇区数据,进行写入
  8. 完成复制

fetch请求file://格式json文件

(function() {
  var nativeFetch = window.fetch;
  if(nativeFetch) {
    var a = document.createElement('a');
    window.fetch = function(url) {
      a.href = url;
      var full_url = a.href;
      if(full_url.indexOf('file:') === 0) {
        return new Promise(function(resolve, reject) {
          var xhr = new XMLHttpRequest();
          xhr.onload = function() {
            resolve(new Response(xhr.responseText, {status: xhr.status}));
          };
          xhr.onerror = function(err) {
            reject(new TypeError('Local request failed'));
          };
          xhr.open('GET', url);
          xhr.send(null);
        });
      }
      else {
        return nativeFetch.call(this, Array.prototype.slice.apply(arguments));
      }
    };
  }
})();
This page loaded in 0.002147 seconds