• Notion + CloudFlare + 域名搭建网站


    Notion + CloudFlare + 域名搭建网站

    Created: March 21, 2022 11:42 AM

    0你需要有cloudflare,一个域名和notion账号,并且notion有一个开放的网页

    Untitled

    已进入cloudflare,如果你没有使用cloudflare他会让你在你购买域名的机构做修改。按照cloudflare官方指引来就可以。

    1.CloudFlare 配置 CNAME 记录 ( ajiang.online → notion.so )

    Untitled

    Untitled

    前方添加你的域名或子域名(这里以ajiang.online为例)目标填写为notion.so

    3配置worker

    Untitled

    Untitled

    Untitled

    • 直接复制代码

      1. /* CONFIGURATION STARTS HERE */
      2.   
      3.   /* Step 1: enter your domain name like fruitionsite.com */
      4.   const MY_DOMAIN = 'fruitionsite.com';#改成你的域名
      5.   
      6.   /*
      7.    * Step 2: enter your URL slug to page ID mapping
      8.    * The key on the left is the slug (without the slash)
      9.    * The value on the right is the Notion page ID
      10.    */
      11.   const SLUG_TO_PAGE = {
      12.     '''771ef38657244c27b9389734a9cbff44',#改成你的page
      13.   };
      14.   
      15.   /* Step 3: enter your page title and description for SEO purposes */
      16.   const PAGE_TITLE = '';
      17.   const PAGE_DESCRIPTION = '';
      18.   
      19.   /* Step 4: enter a Google Font name, you can choose from https://fonts.google.com */
      20.   const GOOGLE_FONT = '';
      21.   
      22.   /* Step 5: enter any custom scripts you'd like */
      23.   const CUSTOM_SCRIPT = ``;
      24.   
      25.   /* CONFIGURATION ENDS HERE */
      26.   
      27.   const PAGE_TO_SLUG = {};
      28.   const slugs = [];
      29.   const pages = [];
      30.   Object.keys(SLUG_TO_PAGE).forEach(slug => {
      31.     const page = SLUG_TO_PAGE[slug];
      32.     slugs.push(slug);
      33.     pages.push(page);
      34.     PAGE_TO_SLUG[page] = slug;
      35.   });
      36.   
      37.   addEventListener('fetch', event => {
      38.     event.respondWith(fetchAndApply(event.request));
      39.   });
      40.   function generateSitemap() {
      41.     let sitemap = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
      42.     slugs.forEach(
      43.       (slug) =>
      44.         (sitemap +=
      45.           '<url><loc>https://' + MY_DOMAIN + '/' + slug + '</loc></url>')
      46.     );
      47.     sitemap += '</urlset>';
      48.     return sitemap;
      49.   }
      50.   
      51.   const corsHeaders = {
      52.     'Access-Control-Allow-Origin': '*',
      53.     'Access-Control-Allow-Methods': 'GET, HEAD, POST, PUT, OPTIONS',
      54.     'Access-Control-Allow-Headers': 'Content-Type',
      55.   };
      56.   
      57.   function handleOptions(request) {
      58.     if (request.headers.get('Origin') !== null &&
      59.       request.headers.get('Access-Control-Request-Method') !== null &&
      60.       request.headers.get('Access-Control-Request-Headers') !== null) {
      61.       // Handle CORS pre-flight request.
      62.       return new Response(null, {
      63.         headers: corsHeaders
      64.       });
      65.     } else {
      66.       // Handle standard OPTIONS request.
      67.       return new Response(null, {
      68.         headers: {
      69.           'Allow': 'GET, HEAD, POST, PUT, OPTIONS',
      70.         }
      71.       });
      72.     }
      73.   }
      74.   
      75.   async function fetchAndApply(request) {
      76.     if (request.method === 'OPTIONS') {
      77.       return handleOptions(request);
      78.     }
      79.     let url = new URL(request.url);
      80.     url.hostname = 'www.notion.so';
      81.     if (url.pathname === '/robots.txt') {
      82.       return new Response('Sitemap: https://' + MY_DOMAIN + '/sitemap.xml');
      83.     }
      84.     if (url.pathname === '/sitemap.xml') {
      85.       let response = new Response(generateSitemap());
      86.       response.headers.set('content-type', 'application/xml');
      87.       return response;
      88.     }
      89.     let response;
      90.     if (url.pathname.startsWith('/app') && url.pathname.endsWith('js')) {
      91.       response = await fetch(url.toString());
      92.       let body = await response.text();
      93.       response = new Response(body.replace(/www.notion.so/g, MY_DOMAIN).replace(/notion.so/g, MY_DOMAIN), response);
      94.       response.headers.set('Content-Type', 'application/x-javascript');
      95.       return response;
      96.     } else if ((url.pathname.startsWith('/api'))) {
      97.       // Forward API
      98.       response = await fetch(url.toString(), {
      99.         body: url.pathname.startsWith('/api/v3/getPublicPageData') ? null : request.body,
      100.         headers: {
      101.           'content-type': 'application/json;charset=UTF-8',
      102.           'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
      103.         },
      104.         method: 'POST',
      105.       });
      106.       response = new Response(response.body, response);
      107.       response.headers.set('Access-Control-Allow-Origin', '*');
      108.       return response;
      109.     } else if (slugs.indexOf(url.pathname.slice(1)) > -1) {
      110.       const pageId = SLUG_TO_PAGE[url.pathname.slice(1)];
      111.       return Response.redirect('https://' + MY_DOMAIN + '/' + pageId, 301);
      112.     } else {
      113.       response = await fetch(url.toString(), {
      114.         body: request.body,
      115.         headers: request.headers,
      116.         method: request.method,
      117.       });
      118.       response = new Response(response.body, response);
      119.       response.headers.delete('Content-Security-Policy');
      120.       response.headers.delete('X-Content-Security-Policy');
      121.     }
      122.   
      123.     return appendJavascript(response, SLUG_TO_PAGE);
      124.   }
      125.   
      126.   class MetaRewriter {
      127.     element(element) {
      128.       if (PAGE_TITLE !== '') {
      129.         if (element.getAttribute('property') === 'og:title'
      130.           || element.getAttribute('name') === 'twitter:title') {
      131.           element.setAttribute('content', PAGE_TITLE);
      132.         }
      133.         if (element.tagName === 'title') {
      134.           element.setInnerContent(PAGE_TITLE);
      135.         }
      136.       }
      137.       if (PAGE_DESCRIPTION !== '') {
      138.         if (element.getAttribute('name') === 'description'
      139.           || element.getAttribute('property') === 'og:description'
      140.           || element.getAttribute('name') === 'twitter:description') {
      141.           element.setAttribute('content', PAGE_DESCRIPTION);
      142.         }
      143.       }
      144.       if (element.getAttribute('property') === 'og:url'
      145.         || element.getAttribute('name') === 'twitter:url') {
      146.         element.setAttribute('content', MY_DOMAIN);
      147.       }
      148.       if (element.getAttribute('name') === 'apple-itunes-app') {
      149.         element.remove();
      150.       }
      151.     }
      152.   }
      153.   
      154.   class HeadRewriter {
      155.     element(element) {
      156.       if (GOOGLE_FONT !== '') {
      157.         element.append(` ', '+')}:Regular,Bold,Italic&display=swap" rel="stylesheet">
      158.         `, {
      159.           html: true
      160.         });
      161.       }
      162.       element.append(``, {
      163.         html: true
      164.       })
      165.     }
      166.   }
      167.   
      168.   class BodyRewriter {
      169.     constructor(SLUG_TO_PAGE) {
      170.       this.SLUG_TO_PAGE = SLUG_TO_PAGE;
      171.     }
      172.     element(element) {
      173.       element.append(`Powered by Fruition
  •       ${CUSTOM_SCRIPT}`, {
  •         html: true
  •       });
  •     }
  •   }
  •   
  •   async function appendJavascript(res, SLUG_TO_PAGE) {
  •     return new HTMLRewriter()
  •       .on('title', new MetaRewriter())
  •       .on('meta', new MetaRewriter())
  •       .on('head', new HeadRewriter())
  •       .on('body', new BodyRewriter(SLUG_TO_PAGE))
  •       .transform(res);
  •   }
  • 或者直接在下方输入你的域名和notionurl再点击“COPY THE CODE”,配置文件会自动生成。

    https://fruition.stephenou.vercel.app

4配置路由

在worker右边选择“添加路由”

Untitled

添加你的域名之后选择刚才复制的worker

Untitled

保存后就可以正常查看了。

示例网站

Fruition: Free, Open Source Toolkit for Building Websites with Notion (fruitionsite.com)

  • 相关阅读:
    OpenAI 重磅发布GPT 4o!可以视频聊天的AI?
    算法入门之队列
    元宇宙之问:产业与资本为什么扎堆元宇宙
    算法day42|背包问题
    java泛型fastjson阅读泛型解析乱谈一通
    css知识学习系列(17)-每天10个知识点
    Webpack从0到1搭建Vue3项目
    Nanoprobes纳米探针丨Nanogold偶联物的特点和应用
    acwing 2811. 最长公共子串(SAM)
    论文常见拉丁术语
  • 原文地址:https://blog.csdn.net/sherlockmj/article/details/126841162