多鏈支援,真沒你想的那麼簡單

多鏈錢包整合的實踐反思 總算是空閒下來可以整理一下程式碼了,Web3 專案接入多鏈錢包連接功能,主要涉及 Ethereum、Polygon、BSC 和 Solana。乍一聽好像只是「多做幾套相容邏輯」的事,但真正落地後才發現,很多東西其實沒想得那麼簡單。 this.networkConfigs = { ethereum: { chainId: '0x1', // 1 chainName: 'Ethereum Mainnet', nativeCurrency: { name: 'Ethereum', symbol: 'ETH', decimals: 18 }, rpcUrls: ['https://eth-mainnet.public.blastapi.io'], blockExplorerUrls: ['https://etherscan.io'] }, polygon: { chainId: '0x89', // 137 chainName: 'Polygon Mainnet', nativeCurrency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 }, rpcUrls: ['https://polygon-rpc.com'], blockExplorerUrls: ['https://polygonscan.com'] }, bsc: { chainId: '0x38', // 56 chainName: 'BNB Smart Chain', nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 }, rpcUrls: ['https://bsc-dataseed.binance.org'], blockExplorerUrls: ['https://bscscan.com'] } } 多鏈並非簡單的「支援多個錢包」 最大的感受是:鏈不一樣,錢包互動方式也不一樣,連 SDK 的思維方式都不一樣。以太坊生態可以用統一的 Web3.js 處理很多邏輯,而到了 Solana,你會發現它完全是另一套系統:Provider 接入、連接流程、PublicKey 建構方式都不太一樣,甚至連網路延遲和穩定性都影響體驗。 ...

2025年7月5日 · 10 min · MoeJue

[筆記] Git 常用命令大全(按場景分類)

適用於日常開發中對 Git 的常見操作。透過分類整理,幫助你快速上手或查閱。 📦 基礎指令 指令 用途 git init 初始化一個 Git 儲存庫(建立 .git 資料夾)。 git clone <url> 將遠端儲存庫複製到本地。 git status 查看目前工作目錄狀態(檔案修改、暫存等)。 git add <file> 將檔案新增到暫存區。 git commit -m "message" 提交暫存區檔案到本地儲存庫,並新增提交訊息。 git log 查看提交歷史。 🌱 分支管理 指令 用途 git branch 查看本地分支列表。 git branch <branch-name> 建立一個新分支。 git checkout <branch-name> 切換到指定分支。 git switch <branch-name> 切換到指定分支(推薦使用的新指令)。 git merge <branch-name> 將指定分支合併到目前分支。 git branch -d <branch-name> 刪除已合併的分支。 git branch -D <branch-name> 強制刪除分支。 🌍 遠端儲存庫操作 指令 用途 ...

2025年6月2日 · 2 min · MoeJue

什麼是Web3.0,與區塊鏈又有什麼關係?

又是一個莫名其妙的詞語的新起-。- 我大致歸納為以下幾個點 什麼是web3.0 Web 3.0(Web3)是下一代網際網路的發展方向,旨在創建一個更加去中心化、用戶控制和數據保護的網路環境。與之前的Web 1.0(靜態網頁)和Web 2.0(動態、互動式網頁和社交媒體)不同,Web 3.0的核心理念和技術包括以下幾個方面: 去中心化: 區塊鏈技術:Web 3.0的核心是區塊鏈技術,它提供了一個去中心化的帳本,記錄所有的交易和數據變化。這意味著數據不再由單一的中央伺服器控制,而是分佈在多個節點上。 分佈式應用(DApps):這些應用程式運行在區塊鏈網路上,沒有中心化的控制者。DApps的用戶可以直接進行交易和互動,而無需通過中介機構。 用戶控制和數據保護: 用戶主權身份:在Web 3.0中,用戶可以完全控制自己的數位身份和數據。通過加密技術,用戶可以決定誰可以訪問他們的数据以及如何使用這些數據。 數據所有權:用戶的數據儲存在去中心化的網路上,用戶擁有數據的所有權,而不是由大公司集中管理和控制。 智能合約: 自動執行協議:智能合約是在區塊鏈上運行的自動化協議,當滿足特定條件時自動執行。這種技術可以用於各種場景,如金融交易、供應鏈管理和法律合約。 互操作性: 跨平台和跨鏈技術:Web 3.0致力於實現不同區塊鏈和分佈式網路之間的互操作性,使得數據和資產可以在不同平台之間無縫轉移。 去信任化和透明度: 無信任機制:Web 3.0通過區塊鏈技術實現了無信任機制,即參與者無需互相信任或依賴第三方中介,就能進行安全的交易和互動。 透明性:所有交易和數據變更記錄在區塊鏈上,公開透明且不可篡改,提高了信任度和安全性。 Web 3.0的應用場景 去中心化金融(DeFi):通過智能合約和區塊鏈技術,提供無需中介的金融服務,如借貸、交易和投資。 數位身份:用戶可以創建和管理自己的數位身份,控制個人數據的訪問和使用。 供應鏈管理:通過區塊鏈技術,實現供應鏈的透明和可追溯性,防止偽造和欺詐。 內容創作和分發:藝術家、音樂家和作家可以直接與觀眾互動和交易,獲得更公平的收益分配。 那什麼又是區塊鏈呢? 區塊鏈技術是一種分佈式帳本技術(Distributed Ledger Technology, DLT),用於記錄交易和資訊的不可篡改、去中心化的資料庫。區塊鏈技術的核心思想是通過去中心化的方式實現數據的安全、透明和可信。 區塊鏈的基本原理 區塊(Block): 區塊是包含交易記錄的數據包。每個區塊包含多個交易和一個哈希值(用於唯一標識該區塊)。 區塊還包含上一個區塊的哈希值,從而將所有區塊連接成鏈,形成區塊鏈。 鏈(Chain): 區塊通過哈希值相互連接,形成一個鏈式結構。每個區塊包含前一個區塊的哈希值,這使得區塊鏈中的數據難以篡改。 如果試圖更改一個區塊中的數據,將導致該區塊及其後續所有區塊的哈希值發生變化,需要重新計算所有這些區塊的哈希值,這幾乎是不可能的。 去中心化(Decentralization): 區塊鏈網路中的所有節點(電腦)都保存一個完整的區塊鏈副本,這些副本通過共識機制保持一致。 沒有中央機構控制或管理區塊鏈,數據由所有節點共同維護。 共識機制(Consensus Mechanism): 區塊鏈網路使用共識機制來確保所有節點對區塊鏈的狀態達成一致。常見的共識機制包括工作量證明(Proof of Work, PoW)和權益證明(Proof of Stake, PoS)。 工作量證明(PoW):礦工通過解決複雜的數學問題來驗證交易,並將其添加到區塊鏈中。解決問題需要大量計算能力,確保了區塊鏈的安全性。 權益證明(PoS):驗證者根據其持有的加密貨幣數量和其他因素來驗證交易,並獲得相應的獎勵。 加密技術(Cryptography): -區塊鏈使用加密技術確保數據的安全性和隱私性。每個交易都使用公鑰和私鑰進行簽名和驗證,確保只有合法的所有者才能發起交易。 區塊鏈的優點 安全性: 數據分佈在多個節點上,沒有單點故障,攻擊者難以篡改數據。 每個區塊包含上一個區塊的哈希值,篡改一個區塊需要更改整個鏈條,成本極高。 2.透明性: 區塊鏈上的所有交易記錄都是公開可見的,任何人都可以查閱。 交易記錄不可篡改,提高了系統的透明度和信任度。 3.去中心化: 沒有中央控制機構,所有節點平等參與網路的維護和管理,防止了單點控制和權力集中。 4.不可篡改性: 一旦數據被寫入區塊鏈,就很難被篡改,確保了數據的完整性和真實性。 區塊鏈的應用場景 加密貨幣: ...

2024年6月17日 · 1 min · MoeJue

熱敏藍牙印表機開發

最近在做小票打印這塊,項目需求是IOS和安卓兩種都要實現,開始做的時候也是一臉懵,然後網上找了不少資料,踩了一堆坑,看了好多文章,結果還好成了 藍牙打印機一般分為兩種打印模式,票據打印、標籤打印 公司買的渣渣打印機連開發文檔都沒有,害我走了不少坑,讓我開發買的時候也不諮詢諮詢我 目前微信小程序連接藍牙打印機 wx.createBLEConnection 測試在IOS設備上沒有問題,在部分安卓手機上會出現異常(表現為,連接是會彈出系統配對框,不管點取消還是輸入配對碼後點確定,都會立馬斷開連接。如果不輸入也不取消則會在30秒以內自動斷開藍牙打印機) 現在採用的方式是各給安卓和IOS寫一套藍牙打印的命令 IOS // ====================藍牙操作================== //初始化藍牙模組 openBluetoothAdapter() { if (app.sysinfo.provider == 1) { // 開啟藍牙 app.onBluetooth() setTimeout(() => { this.android\_search() }, 2000) return false; } this.closeBluetoothAdapter() uni.openBluetoothAdapter({ success: (res) => { console.log("初始化藍牙模組: " + JSON.stringify(res)); this.startBluetoothDevicesDiscovery() }, fail: (res) => { if (res.errCode === 10001) { uni.onBluetoothAdapterStateChange((res) => { console.log('監聽藍牙適配器狀態變化事件', res) if (res.available == false) { app.global\_printing = {} this.connected = false this.chs = \[\] this.canWrite = false } if (res.available) { this.startBluetoothDevicesDiscovery() } }) } if (res.errCode) { app.alert('初始化藍牙失敗,錯誤碼:' + res.errCode) return false; } app.alert(res.errMsg) } }) }, ...

2019年11月5日 · 9 min · MoeJue

微信授權登入

文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 微信的授權登入與QQ、新浪等平台的授權登入大同小異,均採用OauthOAuth2.0鑑權方式。 微信授權分為兩種: 靜默授權 彈窗授權,需要用戶手動同意 兩種scope的區別說明 以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的用戶openid的,並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(往往是業務頁面) 以snsapi_userinfo為scope發起的網頁授權,是用來獲取用戶的基本資訊的。但這種授權需要用戶手動同意,並且由於用戶同意過,所以無須關注,就可在授權後獲取該用戶的基本資訊。 用戶管理類介面中的「獲取用戶基本資訊介面」,是在用戶和公眾號產生訊息交互或關注後事件推送後,才能根據用戶OpenID來獲取用戶基本資訊。這個介面,包括其他微信介面,都是需要該用戶(即openid)關注了公眾號後,才能呼叫成功的。 具體而言,網頁授權流程分為四步: 引導用戶進入授權頁面同意授權,獲取code 透過code換取網頁授權access_token(與基礎支援中的access_token不同) 如果需要,開發者可以重新整理網頁授權access_token,避免過期 透過網頁授權access_token和openid獲取用戶基本資訊(支援UnionID機制) 以下是封裝的微信操作類,需要用到兩個資料表,用於保存access_token、ticket,由於它們具有一定有效期,且每天請求數有上限,所以開發者需自行保存 <?php /\*\* \* 微信操作表 \* wxtoken 表結構 \* id \* access\_token \* addtime \* wxticket 表結構 \* id \* ticket \* addtime \*/ class WX { private $appid; private $appserect; private $curl; private $msg; protected $errs = array( '-1' => '系統繁忙,此時請開發者稍候再試', '0' => '請求成功', '40001' => 'AppSecret錯誤或者AppSecret不屬於這個公眾號,請開發者確認AppSecret的正確性', '40002' => '請確保grant\_type字段值為client\_credential', '40164' => '呼叫介面的IP地址不在白名單中,請在介面IP白名單中進行設定。', ); function \_\_construct($appid, $appserect) { $this->appid = $appid; $this->appserect = $appserect; $this->curl = new Curl(); } /\* 微信網頁授權登入 需要在公眾號設定 - 功能設定 - 網頁授權域名 第一步:用戶同意授權,獲取code scope : snsapi\_base 只能獲取openid 直接跳轉 snsapi\_userinfo \*/ public function getCode($redirect\_uri, $scope = 'snsapi\_userinfo',$state = '1') { $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect\_uri={$redirect\_uri}&response\_type=code&scope={$scope}&state={$state}#wechat\_redirect"; header("Location:{$url}"); exit; } /\* 第二步:透過code換取網頁授權access\_token \*/ public function getAccessTokenByCode($code) { $url = "https://api.weixin.qq.com/sns/oauth2/access\_token?appid={$this->appid}&secret={$this->appserect}&code={$code}&grant\_type=authorization\_code"; // exit($url); // $curl = new Curl(); $result = $this->curl->doGet($url); if (!$result) { // $this->curl->getError() $this->msg = "獲取token失敗"; return false; } $result = json\_decode($result, true); if ($result\['errcode'\]) { $this->msg = $result\['errmsg'\]; return false; } return $result; } // 第三步:重新整理access\_token(如果需要) 透過code 獲取openid $type 0靜默授權 1彈窗授權 public function getUserInfo($code, $type = 0, $lang = 'zh\_CN ') { $result = $this->getAccessTokenByCode($code); if (!$result) { return false; } $member = C::t(PT\_USER)->getByOpenid($result\['openid'\]); if ($member) { return $member; } else { if ($type) { $url = "https://api.weixin.qq.com/sns/userinfo?access\_token={$result\['access\_token'\]}&openid={$result\['openid'\]}&lang={$lang}"; // $return = $this->curl->doGet($url); // 這介面有病 強制顯示文件頭 $return = file\_get\_contents($url); if (!$return) { $this->msg = '獲取用戶資訊失敗'; return false; } $return = json\_decode($return, true); if (!$return) { $this->msg = '獲取用戶資訊返回失敗'; return false; } // file\_put\_contents('ccc.txt',print\_r($return,true),FILE\_APPEND); $data = array( 'openid' => $return\['openid'\], 'name' => $return\['nickname'\], 'sex' => $return\['sex'\], 'province' => $return\['province'\], 'city' => $return\['city'\], 'country' => $return\['country'\], 'img' => $return\['headimgurl'\], 'bindtel' => 0, ); } else { $data = array( 'openid' => $result\['openid'\], 'username' => "微信用戶\_" . random(6,1) ); } $name = rand(100000, 1000000000); $e = $name . "@qq.com"; $password = $e; $id = UserAddEdit(0, $data\['username'\], $password, $e,10,0,"", $msg); if ($id <= 0) { $this->msg = $msg; return false; } C::t(PT\_USER)->update($data, $id); $member = C::t(PT\_USER)->get($id); return $member; } } /\* 公眾號 安全中心 設定IP白名單 公眾號的全局唯一介面呼叫憑據,公眾號呼叫各介面時都需使用access\_token。開發者需要進行妥善保存。access\_token的儲存至少要保留512個字符空間。access\_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access\_token失效。 \*/ public function getAccessToken($type) { $addtime = TIMESTAMP - 7200; $url = "https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&appid={$this->appid}&secret={$this->appserect}"; $row = C::t(PT\_WXTOKEN)->getNew($addtime, $type); if ($row) { return $row\['access\_token'\]; } else { $result = $this->curl->doGet($url); if (!$result) { $this->msg = "無法獲取令牌內容"; return false; } $result = json\_decode($result, true); if (!$result) { $this->msg = "解析令牌內容失敗"; return false; } if ($result\['access\_token'\]) { C::t(PT\_WXTOKEN)->addToken($result\['access\_token'\], $type); return $result\['access\_token'\]; } else { $this->msg = "獲取令牌失敗"; return false; } } } // 獲取js票據 需要在公眾號設定 - 功能設定 - JS介面安全域名設定 public function getJsTicket() { $addtime = TIMESTAMP - 7200; $row = C::t(PT\_WXTICKET)->getNew($addtime); if ($row) { return $row\['ticket'\]; } else { $token = $this->getAccessToken(); if (!$token) { return false; } $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access\_token={$token}&type=jsapi"; $result = $this->curl->doGet($url); if (!$result) { $this->msg = "無法獲取js票據"; return false; } $result = json\_decode($result, true); if (!$result) { $this->msg = "解析js票據內容失敗"; return false; } if ($result\['ticket'\]) { C::t(PT\_WXTICKET)->addTicket($result\['ticket'\]); return $result\['ticket'\]; } else { $this->msg = "獲取js票據失敗"; return false; } } } // js sdk 票據簽名 當前網頁的URL,不包含#及其後面部分 public function jsSign($data) { // 1.所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序) ksort($data); // 2.URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1 採用原始值,不進行URL 轉義 $string1 = $this->ToUrlParams($data); // echo "string1:{$string1}"; // 3.對string1做sha1加密 $sign = sha1($string1); // echo "signature:{$sign}"; return $sign; } // 獲取訊息內容 public function getMsg() { return $this->msg; } /\*\* \* 格式化參數格式化成url參數 \*/ public function ToUrlParams($data) { $buff = ""; foreach ($data as $k => $v) { if ($k != "sign" && $v != "" && !is\_array($v)) { $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } } ?> // 微信登入 function wxlogin() { global $_G,$identifier,$config,$wx; if (!$_G[‘uid’]) { if ($_GET[‘state’]) { // 回調 $member = $wx->getUserInfo($_GET[‘code’]); if (!$member) { exit($wx->getMsg()); } if (!function_exists(“setloginstatus”)) { include_once libfile(‘function/member’); } // 設定登入狀態$wx setloginstatus($member, 2592000); checkfollowfeed(); $_G[‘uid’] = $member[‘uid’]; $_G[‘member’] = $member; } else { // 請求授權 對參數編碼 $redirect = urlencode(getProtocol() . $_SERVER[‘HTTP_HOST’] . $_SERVER[‘REQUEST_URI’]); $wx->getCode($redirect, ‘snsapi_base’); } } } function getProtocol() { return is_HTTPS() ? ‘https://’ : ‘http://’; } function is_HTTPS() { if ($_SERVER[‘HTTPS’] === 1 || $_SERVER[‘HTTPS’] === ‘on’ || $_SERVER[‘SERVER_PORT’] == 443) { return true; } return false; }

2019年4月5日 · 4 min · MoeJue

微信JSAPI支付

前陣子一直在做微信相關的業務,雖說不是什麼新技術,但之前一直沒有機會接觸到,然後踩了些坑,抽空整理記錄下。 微信支付一共分為7種,分別是:付款碼支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付、人臉支付。 此次業務中使用到的是微信JSAPI支付:用戶透過微信掃碼、關注公眾號等方式進入商家H5頁面,並在微信內呼叫 JSSDK完成支付 文件:https://pay.weixin.qq.com/wiki/doc/api/index.html SDK:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1 ](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1)JSAPI支付需要在微信中的瀏覽器打開才能喚起微信支付,效果如下圖 附上介面程式碼 程式碼中使用了模板引擎 html: {$competition\['username'\]} {$prices\[0\]}鑽 {$prices\[1\]}鑽 {$prices\[2\]}鑽 {$prices\[3\]}鑽 {$prices\[4\]}鑽 註:1鑽=1元,1鑽={$activity\['offset'\]}票 立即微信支付 JavaScript: // 投票 var offset = {$activity[‘offset’]}; $(’#tips’).html(‘正在給{$competition[‘code’]}號贈送{$prices[0]}鑽=’+({$prices[0]}*offset)+‘票’); $(’#vote’).click(function(){ $.post(’/index/index/detailed.html?cid={$cid}&aid={$aid}’,{ formhash :’{FORMHASH}’, submit:‘1’, type:1, openid:’{$_G[‘member’][‘openid’]}’ },function(res){ alert(res.msg); if (res.code == 0) { $(’.box-1 span’).text(res.data.all); $(’.box-2 span’).text(res.data.rank); $(’.box-3 span’).text(res.data.up + ‘票’); } }); }) /* jQuery物件級別外掛程式擴展 */ $.fn.extend({ /* 單選框 */ hlRadio:function () { var radioEl=$(this); radioEl.click(function () { var price = 0; price = $(‘input:radio:checked’).val(); $(’#price’).val(’’); $(’#tips’).html(‘正在給{$competition[‘code’]}號贈送’+price+‘鑽=’+(price*offset)+‘票’); radioEl.siblings(“div”).removeClass(“active”); $(this).siblings(“div”).addClass(“active”); }); }, }); $(“input[name=‘price’]”).hlRadio(); $(’#price’).bind(‘input propertychange’, function(){ var price = 0; price = $(’#price’).val(); $(’#tips’).html(‘正在給{$competition[‘code’]}號贈送’+price+‘鑽=’+(price*offset)+‘票’); }) ...

2019年3月30日 · 4 min · MoeJue

[筆記]Git常用命令大全

繼上一次之後,我抽空整理了一份比較完整的 Git 常用命令清單,並找到了一張非常棒、非常高清的導圖(1759*3162)。 查看、新增、提交、刪除、找回、重置修改檔案 git help <command> # 顯示 command 的說明 git show # 顯示某次提交的內容 git show $id git co -- <file> # 捨棄工作區修改 git co . # 捨棄工作區修改 git add <file> # 將工作檔案修改提交到本地暫存區 git add . # 將所有修改過的工作檔案提交暫存區 git rm <file> # 從版本庫中刪除檔案 git rm <file> --cached # 從版本庫中刪除檔案,但不刪除檔案 git reset <file> # 從暫存區恢復到工作檔案 git reset -- . # 從暫存區恢復到工作檔案 git reset --hard # 恢復最近一次提交過的狀態,即放棄上次提交後的所有本次修改 git ci <file> git ci . git ci -a # 將 git add, git rm 和 git ci 等操作都合併在一起執行 git ci -am "some comments" ...

2018年6月16日 · 3 min · MoeJue

在 Linux 上安裝 PHP 環境

學習環境:Centos 7.2 正式版_64位 # 更新來源 yum update 安裝 Nginx yum install nginx -y 安裝 MySQL wget https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm yum localinstall mysql57-community-release-el7-11.noarch.rpm 安裝 PHP 7.2 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum update yum install -y php72w-cli php72w-common php72w-dba php72w-devel php72w-fpm php72w-gd php72w-imap php72w-mbstring php72w-mysql php72w-pdo php72w-pdo_dblib php72w-pear php72w-pecl-igbinary php72w-pecl-xdebug php72w-process php72w-xml php72w-xmlrpc php72w-opcache php72w-pecl-memcached php72w-pecl-mongodb php72w-pecl-redis 啟動服務 service nginx start service mysql start service php-fmp start /usr/sbin/php-fpm –nodaemonize –fpm-config /etc/php-fpm.conf > /dev/null 2>&1 & ...

2018年5月7日 · 1 min · MoeJue

Git簡單的使用步驟

本文不闡述任何概念性知識,僅僅只是做一個筆記,簡單的使用步驟,如遇障礙,請Google一下 使用SSH 完成 Git 與 GitHub 的綁定 生成 SSH key ssh-keygen -t rsa 指定 RSA 演算法生成金鑰,之後就會生成兩個檔案,分別為id_rsa和id_rsa.pub,即私鑰id_rsa和公鑰id_rsa.pub。對於這兩個檔案 添加 SSH key github.com -> Settings -> SSH and GPG -> New SSH key 將公鑰id_rsa.pub的內容貼到Key處的位置(Titles的內容不填寫也沒關係),然後點擊Add SSH key 即可。 驗證綁定是否成功 ssh -T git@github.com 把本地專案推送到github的命令 (1) 打開你的目錄 cd demo (2) 初始化版本庫,用於生成git檔案 git init (3) 將所有檔案添加到暫存區 git add * (4) 提交目前工作空間的修改內容 git commit -m "first commit" (5) 將儲存庫連接到遠端伺服器 git remote add origin <server>(就是上面你儲存庫的地址) (6) 將改動推送到所添加的伺服器上 git push -u origin master 在推送的時候如果出現如下錯誤: warning: redirecting to https://github.com/178146582/dabai.git/ To http://github.com/178146582/dabai.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'http://github.com/178146582/dabai.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. 查了一下錯誤的原因是github中的README.md檔案不在本地程式碼目錄中。所以我們把上面第六步分成兩步: ...

2018年4月3日 · 1 min · MoeJue

利用.htaccess綁定子網域到子目錄

一般情況下,一台虛擬主機只允許綁定一個域名到根目錄下。 使用過emlog的人,應該對其中的靜態連結不陌生,它就是典型的利用.htaccess檔案來對網頁進行域名轉向。 利用.htaccess綁定域名到子目錄,前提是你的空間伺服器必須支援Apache的rewrite功能,只有這樣才能使用.htaccess。如果你的空間是Linux伺服器,一般預設都已開啟。即可以實現綁定域名到子目錄、一個空間多個站點。 下面是以 link.52ecy.cn 綁定到子目錄link為例的.htaccess程式碼。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / 綁定link.52ecy.cn 到子目錄link RewriteCond %{HTTP_HOST} ^link\.52ecy\.cn$ [NC] RewriteCond %{REQUEST_URI} !^/link/ RewriteRule ^(.*)$ link/$1?Rewrite [L,QSA] #可以綁定多個 只需重複上三行程式碼並更改一下域名、目錄名 就好了 如果你已完成上面的步驟,你的子域名應該可以訪問了,但你會發現在瀏覽器上訪問「主域名+綁定的域名目錄」也可以訪問,可這並不是我們想要的。 接下來我們完成最後一步,在每一個綁定的目錄中,如link目錄中,也增加一個 .htaccess 檔案。 .htaccess程式碼如下: 下面是以 music.xmgho.com 綁定到子目錄music為例的.htaccess程式碼。 即可以實現綁定域名到子目錄、一個空間多個站點。即可以實現綁定域名到子目錄、一個空間多個站點。即可以實現綁定域名到子目錄、一個空間多個站點。即可以實現綁定域名到子目錄、一個空間多個站點。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / #只許綁定的域名訪問 RewriteCond %{HTTP_HOST} !^link\.52ecy\.cn$ [NC] RewriteRule (.*) http://link.52ecy.cn/$1 [L,R=301] #對綁定目錄下與 同名的目錄的處理 RewriteCond %{REQUEST_URI} ^\/link\/ [NC] RewriteCond %{QUERY_STRING} !^(.*)?Rewrite RewriteRule ^(.*)$ /%{REQUEST_URI}/%{REQUEST_URI}/$1?Rewrite [L,QSA] 結語: 由於我的伺服器本身就支援子域名綁定到子目錄,所以我自己沒法測試,不過我讓朋友在阿里云的主機測試通過了,但阿里云限制了數量,多綁定的話會跳到根目錄。由此看來,並不是所有的伺服器商都支援這樣玩,還得自行測試。 最後,最重要的一點就是,你的域名得解析過來才有用的[哭笑~]

2018年1月22日 · 1 min · MoeJue