title: Notion绑定域名-你的笔记就是你的博客!
author: Tomatoro
comments: true
tags:

  • Blog
  • Notion
    top: 0
    abbrlink: c60ac904
    date: 2019-11-06 16:04:28

为Notion公共页面提供自定义域名可能是最受要求的功能之一,而且目前看起来还不支持这样做(可以理解)但是,这里有一个使用Cloudflare Workers的解决方案。

第一步: 将你的域名服务器代理至Cloudflare

Cloudflare需要控制您的DNS,因此请按照本指南将名称服务器切换到它们。不用担心,您的DNS设置将保持不变。

Changing your domain nameservers to Cloudflare
这一步很重要,大致可以理解为以下步骤:

  1. 将你原来的nameservers更改为Cloudflare提供给你的nameserver
    Notion绑定域名-你的笔记就是你的博客! - 图1

  2. 比如我的域名是在阿里云的, 进行如下操作即可(修改后需要过一段时间等Cloudflare发邮箱给你)
    Notion绑定域名-你的笔记就是你的博客! - 图2
    Notion绑定域名-你的笔记就是你的博客! - 图3

  3. 在域名解析里添加一条A的记录,IP随便填
    Notion绑定域名-你的笔记就是你的博客! - 图4

  4. 当收到邮件后,你的Cloudflare的Overview页会变成这样,就说明更改nameservers成功了
    Notion绑定域名-你的笔记就是你的博客! - 图5

  5. 在Cloudflare的DNS页里也添加一条A的记录,IP随便填但是要保证Proxy Status是通的
    Notion绑定域名-你的笔记就是你的博客! - 图6

第二步: 添加工程脚本

Big thanks to Mayne for writing this worker script. You can find the original in this gist.

以下是为你代理域的代码,因此请执行以下操作:

  1. Click on the ”Workers” tab
  2. Click “Launch Editor”
  3. On the left, click ”Add Script”
  4. Name it notion-worker

Notion绑定域名-你的笔记就是你的博客! - 图7

Once you have followed those steps, copy this script into that new file.

  1. const MY_DOMAIN = "example.com"
  2. const START_PAGE = "https://www.notion.so/link/to/your/public/page"
  3. addEventListener('fetch', event => {
  4. event.respondWith(fetchAndApply(event.request))
  5. })
  6. const corsHeaders = {
  7. "Access-Control-Allow-Origin": "*",
  8. "Access-Control-Allow-Methods": "GET, HEAD, POST,PUT, OPTIONS",
  9. "Access-Control-Allow-Headers": "Content-Type",
  10. }
  11. function handleOptions(request) {
  12. if (request.headers.get("Origin") !== null &&
  13. request.headers.get("Access-Control-Request-Method") !== null &&
  14. request.headers.get("Access-Control-Request-Headers") !== null) {
  15. // Handle CORS pre-flight request.
  16. return new Response(null, {
  17. headers: corsHeaders
  18. })
  19. } else {
  20. // Handle standard OPTIONS request.
  21. return new Response(null, {
  22. headers: {
  23. "Allow": "GET, HEAD, POST, PUT, OPTIONS",
  24. }
  25. })
  26. }
  27. }
  28. async function fetchAndApply(request) {
  29. if (request.method === "OPTIONS") {
  30. return handleOptions(request)
  31. }
  32. let url = new URL(request.url)
  33. let response
  34. if (url.pathname.startsWith("/app") && url.pathname.endsWith("js")) {
  35. response = await fetch(`https://www.notion.so${url.pathname}`)
  36. let body = await response.text()
  37. try {
  38. response = new Response(body.replace(/www.notion.so/g, MY_DOMAIN).replace(/notion.so/g, MY_DOMAIN), response)
  39. // response = new Response(response.body, response)
  40. response.headers.set('Content-Type', "application/x-javascript")
  41. console.log("get rewrite app.js")
  42. } catch (err) {
  43. console.log(err)
  44. }
  45. } else if ((url.pathname.startsWith("/api"))) {
  46. response = await fetch(`https://www.notion.so${url.pathname}`, {
  47. body: request.body, // must match 'Content-Type' header
  48. headers: {
  49. 'content-type': 'application/json;charset=UTF-8',
  50. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
  51. },
  52. method: "POST", // *GET, POST, PUT, DELETE, etc.
  53. })
  54. response = new Response(response.body, response)
  55. response.headers.set('Access-Control-Allow-Origin', "*")
  56. } else if (url.pathname === `/`) {
  57. let pageUrlList = START_PAGE.split("/")
  58. let redrictUrl = `https://${MY_DOMAIN}/${pageUrlList[pageUrlList.length-1]}`
  59. return Response.redirect(redrictUrl, 301)
  60. } else {
  61. response = await fetch(`https://www.notion.so${url.pathname}`, {
  62. body: request.body, // must match 'Content-Type' header
  63. headers: request.headers,
  64. method: request.method, // *GET, POST, PUT, DELETE, etc.
  65. })
  66. }
  67. return response
  68. }

现在,你已经添加了脚本,您需要更改顶部的两个const:

  1. MY_DOMAIN 表示你需要代理的域名-你自己的域名 ( E.G. example.com)
  2. START_PAGE 表示你代理的目标域名地址-notion的地址(E.G.https://www.notion.so/link/to/your/public/page)

保存你的脚本,然后返回上一层

第三步: 添加一个通配符路径才处理你的所有流量

Notion绑定域名-你的笔记就是你的博客! - 图8

在这里添加你的域名和通配符,然后在你Worker这一栏选择你刚刚配置的脚本名就可以了

  1. example.com/*

到这里为止就大功告成了! 这时候你访问你自己的域名就可以看到notion的页面啦, 以后用notion写博客也可以使用自己的域名了, 可谓是相当酷炫了!

💎最后,这里有我的示例tomatoro.space