---
layout: post
title: Cloudflare规则新功能体验
tags: [Cloudflare, 规则, 功能]
---

  Cloudflare真是良心，为广大站长节约了无数成本！♥<!--more-->    

# 起因
  之前登录到Cloudflare的时候看规则的时候发现了一些新功能，现在好像增加了什么转换规则，动态重定向啥的。看到之后好像还挺有意思，就试用了一下。用了一下之后发现还真不错，功能很强大，而且还免费。所以这次想说说关于Cloudflare规则新出的几个功能体验。   

# 使用体验
  为了更好的描述，我就直接用实例说明了。
## 二级域名重定向到用户页面
  之前Telegram出了个新功能，可以直接用二级域名作为自己的Telegram名片，比如我的用户名是unmayx，在Telegram上就是 <https://unmayx.t.me/> 。这个功能看起来还挺有意思的，所以我也想给自己的网站整一个。其实这个东西如果说自己的网站没有二级域名，直接用页面规则就可以做出来，这个功能能实现也是多亏了Cloudflare愿意让免费用户使用泛解析的代理，真是太良心了😭。首先在解析里加一条泛解析，A或者CNAME都行，目标也可以随便填。然后在页面规则里加一条URL为`*.example.com/*`这样的地址，具体域名写自己的就行，然后设置为转发URL，状态代码301或者302都行，目标URL填类似于`https://example.com/username-$1.html`，具体规则根据自己网站来，像Telegram那样的规则就可以填`https://t.me/$1`这样子 ~~（当然Telegram不可能用Cloudflare的CDN啦🤣）~~ 。   
  不过这样设定有个问题，大多数网站不会只有一级域名，如果有二级域名而且也用了Cloudflare CDN会和规则冲突导致优先匹配规则。Cloudflare原来的页面规则比较拉跨的地方就是除了匹配URL没有别的可以操作的地方，像我要不匹配某个东西也没办法做到。还好新出的动态重定向有这样的功能，它可以匹配一串东西，比如我要不匹配某个地址，比如www开头的我可以写`not starts_with(http.host, "www.")`，反正Cloudflare的证书也没法用在三级以上的域名，这样匹配也没啥问题。另外还要除了自己，所以最终写成`(not starts_with(http.host, "www.") and http.host ne "example.com")`就可以啦，接下来就是写动态重定向到哪里了。我翻了半天[文档](https://developers.cloudflare.com/ruleset-engine/rules-language/)发现除非用正则表达式，否则没有办法单独把`http.host`中“.”前面的东西取出来，然而正则功能不是免费的😂。   
  但是之前用页面规则的时候也没有这个问题啊，怎么这个新功能还有这种问题……不过既然页面规则支持这个功能那我们就可以把两个结合一下，先用动态重定向接收，然后发给页面规则处理就好啦，所以我们可以把刚刚动态重定向的表达式写成一个和现有网站不冲突的地址，比如`concat("https://example.com/user/", http.host, "/")`，这时候它会先重定向到一级域名的某个位置，然后用页面规则接收一下，URL设定为`example.com/user/*.example.com/`，然后目标URL设定为`https://example.com/username-$1.html`就可以啦。   
## Pixiv图片反代
  之前我也有搭过Pixiv的图片反代，是学着[Pixiv圖片代理](https://pixiv.re/reverseproxy.html)的教程搭的，用的是Cloudflare Workers，不过我大概看了下代码其实我们的主要目的只是想让服务器收到可以用的Referer嘛，正好这个新出的转换规则就挺不错的，可以重写URL、请求头和响应头，那么我们这次的需求就是把请求Pixiv图片服务器的请求头改掉吧，那么我们就首先给自己的域名加一条指向i.pximg.net的CNAME解析，像我整的就是 <https://pixiv.mayx.eu.org> ，然后添加一条修改请求头的转换规则，内容就写当`(http.host eq "pixiv.mayx.eu.org")`时，将Referer设定为 <https://www.pixiv.net/> 就好啦（实际上好像是只要包含pixiv字样就可以）。   
  为了让它能发挥更大的用处，我想起来我以前写的[发图微信机器人](/2021/02/23/picbotpro.html)，这次我想整个直接在Web界面就可以用的，于是[Viewer](https://github.com/Mabbs/pixiv-index/blob/main/setu.html)就诞生了，而且用的就是我新设定的反代，相比原来的Workers反代不仅没有了请求次数限制，而且还可以设定页面规则来设置更长时间的缓存，来达到更快的速度。   
## Iwara下载地址解析与DNS解析
  看着这个规则我就又想起来了高中的时候写的[Iwara Viewer](/2019/04/13/iwara.html)，因为跨域我不能直接用Web调用Iwara的API，而且当时主要是为了给服务器获取下载地址。现在我既然可以用转换规则改响应头，那相应的我就可以加一个`Access-Control-Allow-Origin: *`了吧，那这样我也可以用前端去直接调用Iwara的API了吧，所以我简单写了一个[Iwara Downloader](/iwara.html)，因为对JavaScript不是特别熟悉，而且Iwara的目录老是出问题，所以就懒得写Viewer了。现在只要把Iwara的地址粘到输入框里，比如[OBSERVATION DIARY](https://ecchi.iwara.tv/videos/jemn7sgm7wuw0oqv9)，就可以获取到这个视频的下载地址。不过这个东西确实有点鸡肋了😂，毕竟Iwara又不是不给你下载地址。   
  其实我写这个还有个想法就是做在国内下载的加速器，但是那个防盗链实在是整的让人难受，它的Hash目前来看好像是由文件名，Host，过期时间和访问者IP四个值算出来的（有没有更多的我也不清楚），我要是修改了这四个中的任意一项就会403，然而Iwara的域名又被DNS污染了，首先先解决这个问题吧，Cloudflare能代理除了它本身的其他不检查Host的网站，我想了想可以反代Google DNS的DoH，这样我就可以获取到下载地址的真实IP了（顺便dns.mayx.eu.org就相当于我的DoH了）。不过获取到了也没什么用😂，如果改hosts会发现有SNI RST，直接用IP访问防盗链会检查Host字段，我也想过要不然把下载的地址再反代一下？不过因为会检查Host，那个转换规则又不能改Host，所以没办法，就先写这么个东西吧。   

# 感想
  Cloudflare真是良心啊，其他就算是付费CDN可能都没有这么多功能吧，而且还抗打。不过限制还是比较多的，要是能像Nginx那样随意配置该多好啊😂，不过想想也不可能，真那样估计就被大规模滥用了。
