Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

| 7 | 可以做購物車嗎? | 可以串接第三方金流(綠界、Shopify),但建議有穩定訂單量再做 | | 8 | 網站會被攻擊嗎? | 純靜態網站無資料庫,沒有 SQL injection 的入侵入口。CDN 自帶 DDoS 防護 | | 9 | 跟你做跟找設計公司差在哪? | 快(5 天 vs 1 個月)、便宜(約 1/3 價格)、零月費、你自己能更新內容 | | 10 | 以後換人做,網站可以拿走嗎? | 原始碼在 GitHub Private Repo,你可以隨時交接給下一位工程師 | | 11 | FB 上 500 元就有人做,為什麼價差這麼大? | 500 元套版:無法自己改內容、手機版排版會暴走、Google 搜不到、沒有後台。你拿到的是:自己改內容的後台 + 手機完美 + Google 能搜 + 無月費 + 保固 | | 12 | 做好了,怎麼讓更多人來看? | 三步驟:① 送 Search Console(我教你)② 網址放到 IG/LINE/FB 簡介 ③ 每週發一篇文。持續 3 個月就有穩定流量 | | 13 | 我的聯絡表單真的會寄到嗎? | mailto 在手機上如果沒裝郵件軟體會失敗。建議加裝 Cloudflare Email Routing(免費),讓 info@你的網域 自動轉到你的 Gmail | | 14 | 後台會被駭客攻擊嗎? | Git OAuth 登入 = 最高安全等級。可以在 Cloudflare WAF 加規則:後台路徑 /admin/* 限定台灣 IP,阻擋海外暴力嘗試 | | 15 | 有人抄我的網站怎麼辦? | GitHub Private Repo → 原始碼不外洩。前端 HTML/CSS 瀏覽器一定看得到,但後台邏輯、內容管理系統是隱藏的 | | 16 | 信箱要錢嗎?要不要另外買? | 不用。Cloudflare Email Routing 免費提供 info@你的網域,自動轉到你的 Gmail。專業信箱零月費 | | 17 | 為什麼你的方案不用月費,其他公司都要收? | 傳統架站靠主機費/信箱費/維護費賺月費。我們用 Cloudflare 免費方案 + 靜態網站技術,全自動化。客戶只付一次建置費 + 每年網域費 NT$300-800 |

D.6 接案策略與收入評估

客戶類型客源單價月接件數月營收範圍
個人品牌 / 創作者FB 社團、IG、熟人轉介2.5-5 萬2-3 件5-15 萬
微型科技企業創業社群、Meet Taipei、朋友介紹4-8 萬1-2 件4-16 萬
地方服務業Google 地圖、地方社群1.5-3 萬3-4 件4.5-12 萬
專業服務者LinkedIn、產業聚會3-6 萬1-2 件3-12 萬

關鍵是兩個累積型數字,不是月營收:

累積資產說明
月維護費每個案子 1,500-3,000/月,累積 10 個客戶 = 每月 1.5-3 萬被動收入
轉介率客戶滿意 → 推薦朋友 → 零廣告費取得新客戶

可延伸服務金字塔

你現有能力可立刻包裝的加值服務:

層級服務定價工時說明
1Content 代寫NT$500-1,500/篇30 分AI 生成 + 你潤稿
2每季 SEO 報告NT$1,500-3,000/次30 分Search Console + GA4 截圖,AI 產報告
3Google 商家代辦NT$1,500-3,00020 分申請 + 驗證 + 照片上傳
4LINE 官方帳號串接NT$1,000-2,00015 分網站加 LINE 按鈕,後台設 LINE ID 欄位
5網站速度健檢NT$1,000/次15 分Lighthouse 報告 + 建議

策略:基礎建置不賺大錢,靠這些輕量加值服務疊高每客戶營收。全部做完 5 項,每客戶額外營收 NT$5,000-11,500。

[[#table-of-contents|← 回目錄]]


附錄 E:自動化驗證腳本

交付給客戶前,跑完這四個腳本。一個指令 = 一份驗收報告。

# 安裝 lychee(一次性)
brew install lychee

# build 後掃描
npm run build
lychee dist/ --base https://你的網域 --no-progress --exclude "mailto:*"

綠色 = 正常,紅色 = 斷裂連結,要修。

E.2 Sitemap 驗證

DOMAIN="https://你的網域"

# 確認 sitemap-index 使用正確網域(非 localhost 或舊域名)
curl -s "$DOMAIN/sitemap-index.xml" | grep "$DOMAIN"

# 逐一檢查內頁 sitemap 可否訪問
curl -s "$DOMAIN/sitemap-index.xml" | grep -oP '(?<=<loc>)[^<]+' | while read url; do
  code=$(curl -s -o /dev/null -w "%{http_code}" "$url")
  if [ "$code" != "200" ]; then
    echo "❌ $code $url"
  else
    echo "✅ $code $url"
  fi
done

E.3 全頁面 curl 檢查

DOMAIN="https://你的網域"

# 從 src/pages/ 掃出所有頁面路徑,逐一 curl
for f in $(find src/pages -name "*.astro" -not -path "*/admin/*" | sort); do
  path=$(echo "$f" | sed -E \
    -e 's|src/pages||' \
    -e 's|/index\.astro$|/|' \
    -e 's|\.astro$|/|' \
    -e 's|\[\.\.\.slug\]||' \
    -e 's|\[slug\]|test-slug|')
  
  [ "$path" = "/" ] && path="/"
  
  code=$(curl -s -o /dev/null -w "%{http_code}" "${DOMAIN}${path}")
  
  if [ "$code" != "200" ]; then
    echo "❌ $code ${DOMAIN}${path}"
  else
    echo "✅ $code ${DOMAIN}${path}"
  fi
done

E.4 一鍵審計(交付前最終檢查)

#!/bin/bash
# audit.sh — 交付客戶前最後檢查,一個指令跑完
DOMAIN="${1:-https://你的網域}"
PASS=0
FAIL=0

echo "=== 1/5 dead link 檢查 ==="
lychee dist/ --base "$DOMAIN" --no-progress --exclude "mailto:*" 2>/dev/null
[ $? -eq 0 ] && ((PASS++)) || ((FAIL++))

echo ""
echo "=== 2/5 Sitemap 網域檢查 ==="
curl -s "$DOMAIN/sitemap-index.xml" | grep -q "$DOMAIN"
[ $? -eq 0 ] && echo "✅ 網域正確" && ((PASS++)) || { echo "❌ Sitemap 網域錯誤"; ((FAIL++)); }

echo ""
echo "=== 3/5 dist/ 無 localhost 殘留 ==="
grep -rn "localhost" dist/ 2>/dev/null
[ $? -ne 0 ] && echo "✅ 無 localhost 殘留" && ((PASS++)) || { echo "❌ 發現 localhost 殘留"; ((FAIL++)); }

echo ""
echo "=== 4/5 dist/ 無舊 GitHub Pages 殘留 ==="
grep -rn "github\.io\|githubpages" dist/ 2>/dev/null
[ $? -ne 0 ] && echo "✅ 無舊 GitHub Pages 殘留" && ((PASS++)) || { echo "❌ 發現舊 GitHub Pages 殘留"; ((FAIL++)); }

echo ""
echo "=== 5/5 全頁面 200 檢查 ==="
for f in $(find src/pages -name "*.astro" -not -path "*/admin/*" | sort); do
  path=$(echo "$f" | sed -E -e 's|src/pages||' -e 's|/index\.astro$|/|' -e 's|\.astro$|/|' -e 's|\[\.\.\.slug\]||' -e 's|\[slug\]|test-slug|')
  [ "$path" = "/" ] && path="/"
  code=$(curl -s -o /dev/null -w "%{http_code}" "${DOMAIN}${path}")
  [ "$code" = "200" ] && echo "✅ $code ${DOMAIN}${path}" || { echo "❌ $code ${DOMAIN}${path}"; ((FAIL++)); }
done

echo ""
echo "=== 結果 ==="
echo "通過: $PASS / 5"
echo "失敗: $FAIL"
[ $FAIL -eq 0 ] && echo "🎉 全部通過,可以交付客戶!"

交付客戶時,執行 ./audit.sh https://客戶網域,把輸出截圖附在驗收單裡。

audit.sh 已存在於兩個參考專案的根目錄(ming-travel-blog/audit.shming-website/audit.sh)。新專案可直接複製,只改 DOMAIN 變數即可。

E.5 WAF 安全防護(選配)

如果客戶擔心後台被攻擊,可以加一條 WAF 規則:

① Cloudflare 面板 → 你的網域 → Security → WAF
② Create Rule → Field: URI Path → Operator: contains → Value: /admin/
③ AND Field: Country → Operator: does not equal → Value: Taiwan
④ Action: Block
⑤ 完成。海外 IP 無法存取後台路徑

Security Headers(選配,貼到 astro.config.mjs):

// astro.config.mjs 加入 custom headers
import { defineConfig } from 'astro/config';

export default defineConfig({
  // ...其他設定
  server: {
    headers: {
      'X-Content-Type-Options': 'nosniff',
      'X-Frame-Options': 'DENY',
      'Referrer-Policy': 'strict-origin-when-cross-origin',
    }
  }
});

[[#table-of-contents|← 回目錄]]


SOP 手冊 v3.0 — 基於 ming-travel-blog + ming-website 專案真實開發經驗 最後更新:2026-05-01