背景:我要在小程式上顯示pexels.com上的圖片,然後我得先把pexels.com的域名新增到小程式的request合法域名中,但是pexels.com是國外的,在國內沒有備案所以新增不了。解決方案就是:用一個已經備案好的域名進行轉發,轉發的伺服器我選擇的是微信雲託管,備案好的域名還需要ssl,沒有的話本文會講到如何申請一個免費的ssl證書。
因為pexels.com開放了API可以拿到圖片,所以得先請求https://api.pexels.com拿到圖片列表,圖片的域名是images.pexels.com,兩個域名都不能透過小程式後臺的校驗:
所以得需要有一個已備案的域名來進行轉發,這樣就能繞過限制了。
需要準備的物料:
1、一個在國內已經備案好的域名
2、github賬號
大致流程如下:
開通微信雲託管服務
基於微信雲託管模板部署部署一個expressjs服務
修改服務的路由轉發
1、先開通微信雲託管:
進入控制檯:
https://cloud.weixin.qq.com/cloudrun/console
點選新建服務,輸入服務名稱點選確定:
大家可以先fork一下我的程式碼倉庫:
https://github.com/2424004764/pexels-proxy-expressjs,我把轉發的程式碼都寫好了
之後在選擇方式的時候選擇繫結github倉庫:
如果不方便使用github倉庫,也可以將倉庫程式碼包下載下來以手動上傳程式碼包的形式部署:
如果是github的話,提交程式碼以後會重新自動部署,會方便很多,而手動上傳程式碼包的話還得重新上傳再手動點選部署,比較麻煩一點。
選擇好後點選發布按鈕就開始部署了:
等待部署完成,一般這個步驟幾分鐘左右,部署好是這樣的:
我們可以點選雲端除錯測試下服務是否可用:
如果輸出了當前時間,則表明服務是好的。
expressjs服務的index.js程式碼如下:
const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); try { // 建立一個代理中介軟體,將以 /photos 開頭的請求代理到目標地址 const photosProxy = createProxyMiddleware({ target: "http://images.pexels.com/photos", changeOrigin: true, // 設定更改請求頭中的 Origin pathRewrite: { // 將 /photos 開頭的請求重寫為目標地址的不同路徑,保留 /photos '^/photos': '' // 保留 /photos 部分,只替換後面的部分 }, }); // 使用代理中介軟體來處理以 /photos 開頭的請求 app.use('/photos', photosProxy); const photosApiProxy = createProxyMiddleware({ target: "https://api.pexels.com", changeOrigin: true, pathRewrite: { '^/pexels-api': '' } }); // 當請求pexels-api時也轉發 app.use('/pexels-api', photosApiProxy); // 根目錄路由處理函式,輸出當前時間 app.get('/', (req, res) => { const currentTime = new Date().toLocaleString(); // 獲取當前時間 res.send(`Current time is: ${currentTime}`); // 返回當前時間到客戶端 }); app.listen(80, () => { console.log("啟動成功"); }); } catch (error) { console.error('Failed to start application:', error); process.exit(1); // 退出應用並返回非零狀態碼 }
這樣在一個域名下完成了兩個域名的轉發,只要透過字尾區分即可,我們先設定好自定義域名再說這麼訪問。
我們來到自定義域名頁面,點選繫結域名:
假設aaaa.com是你已經備案好的域名,pexels-proxy是二級域名,如果你的域名有https證書的話,可以先把https證書上傳,如果沒有我在本文會講到如果10分鐘申請一個免費https證書。
申請免費證書,我們開啟並註冊一個賬號:
https://www.sslchaoshi.com/
我們選擇體驗版證書:
選擇第一個,點選檢視詳情:
點選購買:
選擇餘額支付:
因為我這裡已經購買過了,所以不能再購買了:
購買後來到個人中心,這裡應該就能看到訂單了:
我記得好像是有驗證的,有一個選項是選擇dns,然後需要驗證域名的cname記錄,按操作完成後等幾分鐘就能下證了:
我們點選證書打包下載,開啟解壓後的目錄的ALL目錄:
我們再回到微信雲託管的自定義域名頁面:
依次上傳證書和私鑰,然後點選確定,之後就會得到一個cname的記錄值:
可在這裡檢車ssl證書狀態(微信官方推薦):
https://myssl.com/ssl.html
再去域名註冊商處解析一個cname記錄即可
訪問方式:
1、如果是請求api:則最終請求url為
https://pexels-proxy.aaaa.com/pexels-api/v1/curated。這樣就能繞過pexels.com未備案的限制了
2、如果是請求的圖片:
我們請求api的時候返回的列表格式為:
我們只需要將圖片的域名改成我們的子域名即可:
let list = [] res.photos.forEach((item, index) => { list.push({ title: item.alt, image: item.src.medium.replace("images.pexels.com", "pexels-proxy.aaaa.com"), }) })
這裡返回的src.original是原圖,medium是小圖,作為列表只用,如果點選,則顯示原圖,這樣圖片就不會失真了。
效果:
這篇文章就到這裡啦!如果你對文章內容有疑問或想要深入討論,歡迎在評論區留言,我會盡力回答。同時,如果你覺得這篇文章對你有幫助,不妨點個贊並分享給其他同學,讓更多人受益。
想要了解更多相關知識,可以檢視我以往的文章,其中有許多精彩內容。記得關注我,獲取及時更新,我們可以一起學習、討論技術,共同進步。
感謝你的閱讀與支援,期待在未來的文章中與你再次相遇!