0%

启动WEB服务时需要绑定IP,日常开发,我们往往这么做,填写0.0.0.0或者127.0.0.1。都work,但两者是不同的,这里总结下两者的不同及注意事项

如下为ExpressJS的一段代码

1
2
3
app.listen(conf.server.port, '0.0.0.0', function () {
console.log(`Example app listening on port http://0.0.0.0:${conf.server.port}!`);
});

127.0.0.1

  1. 该地址为环回IP地址,假如服务绑定该地址,那么使用外网IP,或局域网IP都是不可访问的。

  2. 假如把机器网断了,当执行ping命令时是有返回的,原因是该地址并不会真的走网卡发送请求出去

    https://static.1991421.cn/2022/2022-10-23-123702.jpeg

  3. 当绑定该地址时,访问的话,经常也会使用localhost,但严格来说两者并不对等,因为1个是IP地址,另一个是域名,查看hosts文件也会发现一般会有127.0.0.1 localhost,之所以可以使用localhost,原因在这里

0.0.0.0

  1. 该地址表示本机的所有地址,局域网/外网,所以当绑定时,使用哪个地址都可以正常访问。

写在最后

综上,在配置绑定IP时,需要考虑安全性,从而决定选择哪种配置。只是内部访问就不要配置0.0.0.0

相关文档

最近使用北京易通行扫码坐公交地铁,为了更高效些,开始调研是不是能够做到一键弹出地铁码/公交码,毕竟每次找到App=>启动App=>切换到对应乘车码,这样一套操作还是很麻烦的。

一键唤起App的具体页面功能,该需求能实现的本质就是个URL Scheme,因此关键就是能不能拿到这个信息了。

先说结论,最终我只能实现一键唤起易通行App,即RuubyPay://,而具体地铁码/公交码页面并不行,原因是查不到具体功能/页面的介绍SDK,或者没有猜出来。虽然没有彻底解决,但至少搞清楚了寻找指定App URL Scheme的一般方法了,以后有此需要就这么来搞。

基本方法

  1. Google/GitHub检索

    首先还是万能搜索大法,毕竟别人很多都想到和找到了,比如微信扫码weixin://scanqrcode

  2. 官方文档

    好点的软件对其URL Scheme支持是有系统介绍的,比如Surge/Things等,通过官方文档就可以了解能支持到什么程度。这点微信,美团之类的都没系统的介绍,基本都靠网友自己去找了,这点差评。

  3. iMazing等软件查看app中的info.plist,如果是Mac App的话,直接finder中查看app内容即可,不需要第三方App

    info.plist中检索CFBundleURLSchemes关键词,具体数组值即Scheme

https://static.1991421.cn/2022/2022-10-16-211355.jpeg

  1. 很多App对应网页版经常有点击跳转到对应App,这个跳转链接就是URL Scheme,抓取到网页内容中的该链接即可。比如腾讯会议的网页链接中的一键加入会议,又比如招商银行的活动页,一键打开,通过简单的调试就可以得到URL Scheme。

    https://static.1991421.cn/2022/2022-10-16-214238.jpeg

注意

  1. Scheme区分大小写,比如RuubyPay://可以唤起易通行,而rubbypay://报地址不对
  2. 一个App的Scheme支持多个,也可以没有,这点完全取决于App开发者
  3. info.plist这种办法只能解决唤起App,但是具体页面路径不得而知,因为该部分并不在该文件中提前定义,而是具体代码中实现。具体页面除了SDK/网页代码中抓取,就只能猜了。Scheme正确而路径错误的情况下App是可以正常被唤起,只是无法执行对应动作。
  4. 苹果系统下,iPad/iPhone/Mac均有Scheme支持

特别用途- check目标App安装状态

URL Scheme除了可以用于快速换起某App/具体功能之外,还有个特殊用途即可以查询某App是否安装。

使用方法

  1. info.plist中声明这些App需要查询

    注意URL Scheme query的数量限制为50

1
2
3
4
5
<key>LSApplicationQueriesSchemes</key>
<array>
<string>myapp1</string>
<string>myapp2</string>
</array>
  1. 代码中调用,根据返回值true/false来确定App是否安装
1
UIApplication.shared.canOpenURL(URL(string: "myapp1://test")!)

题外话

之所以了解到该用法是因为taio作者利用这个能力检查用户是否装了Surge类MitM工具进而导致被用户喷。做法虽然过分,但技术无罪,了解下无妨。 相关讨论贴见大家是怎么看待 Taio 的这种行为的

相关文档

刷YouTube视频现在属于高频操作,不过免费版广告太多太频繁。Surge/AdBlock是个办法,但也有副作用,因此还是走会员购买这条路了。

YouTube会员地区收费有所区别, 印度良心些,个人会员(129印度卢比即11.23RMB)/月!但印度会员购买还是有些门槛儿的,这里Mark下我的操作流程。

准备条件

  • visa双币卡,支付需要
  • 好使点的终端,部署代理需要,比如Mac下,我用的iterm2
  • 可能代理,比如访问YouTube,或国外云厂商

印度代理

如果有印度代理的忽略该步骤,没有的,需要购买印度区云机器,

购买印度机器

推荐Vultr等云厂商,这里均按分钟计费

  1. Vultr
  2. DigitalOcean

搭建代理

  1. 如果有Surge,直接走SSH代理,则不需要v2ray等代理
  2. 手动搭建代理,https://alanhg.github.io/v2ray-docker

代理搭建OK后,确保访问时IP地址所在地为印度即可

访问油管,也显示为India

关于付费

属于印度代理网络下后即可正常进行订阅付费,同时如果中途需要更新付费方式等,这点YouTube网络没有限制,比如香港代理等也可以正常的更新支付方式,印度IP仅限于会员激活开通这块。

加入YouTube家庭会员

有时是拼车加入YouTube会员,注意一点假如是印度会员,你需要是印度IP下点击激活链接,否则会提示激活失败。

写在最后

YouTube很香,因此折腾下订阅,值。

今天把博客接入了下AddThis服务,这里mark下流程。

  1. 注册登录AddThis

  2. 点击profile,默认有一个profile

    一个Profile算是一个分享统计服务,我这里希望博客单独统计,那么单独一个profile管理https://static.1991421.cn/2022/2022-10-07-120913.jpeg

  3. 点击右上角的Profile Setting即可获得唯一ID,将ID直接配置到对应站点框架要求的位置即可,如果是自己手动接入的话,点击Get The Code,将代码贴到自己站点即可https://static.1991421.cn/2022/2022-10-07-120939.jpeg

  4. 接入后,还需要手动创建分享工具,支持创建多个。不创建工具,直接访问网站是看不到分享按钮的,

  5. 创建完成后刷新页面即可看到分享按钮

注意

  1. 如果按照步骤还是没有显示,可以查看网络请求,可能是广告拦截插件拦截了
  2. 目前测试AddThis没有被墙

免费的letencrypt签发的证书只给了3个月有效期,为了解决自动化续期,之前已接入Certbot,但一直没work。

最近查看日志发现错误在于我当时配置的域名中有一个*.1991421.cn即泛域名,该类域名需要手动添加DNS TXT记录,因此我的多个证书申请就一直block着没work。为了解决该问题,最近找了下方案,这里mark下。

自动化续期

查看方案发现有这样的库certbot-letencrypt-wildcardcertificates-alydns-au。

大致的实现原理就是借助DNS服务商提供的API解决自动化更新DNS记录的问题,同时Certbot有暴露钩子因此也就可以搭配上域名申请过程。同时该库本身也支持了腾讯云/阿里云服务。

整体OK,但存在几个问题

  1. 支持域名不全,比如VIP域名,这里需要手动添加下。
  2. certbot-auto脚本并不存在,调研发现可以直接切换到certbot即可

搞清楚后,这里我就改造了下,有需求可以直接使用该库,https://github.com/alanhg/certbot-letencrypt-wildcardcertificates-alydns-au

测试发现这样很方便,首次手动申请后,之后便可以自动化了,具体work否等快过期时查看是否正常续期即可。

这样一来,正常情况下就不用操心域名续期问题了。

注意

  1. 比如CentOS,默认自带python环境,因此推荐选择python即可
  2. certbot没必要使用docker安装,直接全局即可,很方便