Skip to content
Danny Lin edited this page Oct 28, 2024 · 12 revisions

側欄與後端伺服器

由於瀏覽器的安全限制,網頁剪貼簿的一些進階功能需要搭配後端伺服器才能運作。後端伺服器可用我們製作的 PyWebScrapBook 架設,基本設定可參見基本操作

PyWebScrapBook 支援許多設定,大部分可藉由編輯 config.ini 調整,可用的設定值可在命令列執行 wsb help config 檢視。以下介紹幾種設定方式:

讓剪貼簿使用 PyWebScrapBook 預設目錄結構

傳統 ScrapBook X 的資料結構是把擷取資料儲存於 data/ 目錄,元資料儲存於 tree/ 目錄,PyWebScrapBook 預設的資料結構則是把擷取資料儲存於貼簿的根目錄,元資料儲存於 .wsb/tree/ 目錄,如此一來所有元資料都統一放置於 .wsb 子目錄下,更方便管理。

若要使用 PyWebScrapBook 預設的資料結構,可省略 wsb config -ba 直接對目錄執行 wsb serve,若已執行過,可編輯 .wsb/config.ini[book ""] 區的選項刪除或設成註解,像這樣:

; [book ""]
; name = scrapbook
; top_dir = 
; data_dir = data
; tree_dir = tree
; index = tree/map.html
; no_tree = false

或者,也可以重新設定:

[book ""]
name = scrapbook
top_dir = 
data_dir = 
tree_dir = .wsb/tree
index = .wsb/tree/map.html
no_tree = false

更改剪貼簿的根目錄

預設情況下後端伺服器可存取特殊資料夾 .wsb。若希望進一步提高安全性及避免因特定錯誤操作搞壞系統,可更改後端伺服器的根目錄使之不包含 .wsb

例如對於以下的目錄結構:

C:\Users\MyUserName\ScrapBooks
C:\Users\MyUserName\ScrapBooks\.wsb
C:\Users\MyUserName\ScrapBooks\public
C:\Users\MyUserName\ScrapBooks\public\tree
C:\Users\MyUserName\ScrapBooks\public\data

以下設定以 C:\Users\MyUserName\ScrapBooks\public 作為後端伺服器的根目錄,而 .wsb 目錄不在可存取範圍:

[app]
root = public

[book ""]
name = scrapbook
top_dir = 
data_dir = data
tree_dir = tree
index = tree/map.html
no_tree = false

此設定會導致備份目錄(預設路徑為 .wsb/backup)無法透過後端伺服器的網頁介面存取。若不希望如此,可把 app.backup_dir 設定為 app.root 以下的路徑,例如 public/backup

架設多個剪貼簿

例如想把後端伺服器架設在 C:\Users\MyUserName\ScrapBooks,其下設三個剪貼簿。目錄結構如下:

C:\Users\MyUserName\ScrapBooks
C:\Users\MyUserName\ScrapBooks\scrapbook1
C:\Users\MyUserName\ScrapBooks\scrapbook2
C:\Users\MyUserName\ScrapBooks\scrapbook3

先開啟並進入命令列,切換工作目錄至 C:\Users\MyUserName\ScrapBooks,執行 wsb config -ba 以產生設定檔,然後開啟純文字編輯器修改 C:\Users\MyUserName\ScrapBooks\.wsb\config.ini,把原先的 [book ""] 區改為以下內容:

上述步驟可簡化為執行 wsb --root "C:\Users\MyUserName\ScrapBooks" config -bae,即會產生及編輯設定檔。

[book ""]
name = Book1
top_dir = scrapbook1
data_dir = 
tree_dir = .wsb/tree
index = .wsb/tree/map.html
no_tree = false

[book "scrapbook2"]
name = Book2
top_dir = scrapbook2
data_dir = 
tree_dir = .wsb/tree
index = .wsb/tree/map.html
no_tree = false

[book "scrapbook3"]
name = Book3
top_dir = scrapbook3
data_dir = 
tree_dir = .wsb/tree
index = .wsb/tree/map.html
no_tree = false

之後執行 C:\Users\MyUserName\ScrapBooks\.wsb\serve.py 即可啟動後端伺服器。網頁剪貼簿可在側欄切換檢視不同剪貼簿(各剪貼簿的顯示名稱由上述的 name 決定)。

在不同剪貼簿之間搬移資料

架設多個剪貼簿時,可在不同剪貼簿之間轉移資料。可在側欄選取要轉移的項目用 複製到... 指令複製到其他剪貼簿。或用 管理 指令開啟其他剪貼簿的視窗,再選取要轉移的項目拖放到該視窗。

也可以把想轉移的項目匯出為封存檔,再匯入至另一個剪貼簿。

在反向代理伺服器後架設剪貼簿伺服器

若剪貼簿伺服器架設在反向代理伺服器後,會需要 X-Forwarded-ForX-Forwarded-HostX-Forwarded-Prefix 等 HTTP 標頭資訊以便正常運作。

剪貼簿伺服器預設會忽略這些 HTTP 標頭,需要設定相關的配置值才會讀取這些值。注意並非所有反向代理伺服器都會設定所有相關 HTTP 標頭,反向代理伺服器不設定的標頭就不應讀取,否則客戶端若偽造了相關標頭可能會造成安全性問題。

示例 1

假設 https://example.com/ 由 nginx 託管,且會把 https://scrapbooks.example.com/ 代理給託管 http://127.0.0.1:8000/ 的 PyWebScrapBook 伺服器,則 nginx 伺服器可設定以下標頭:

location / {
  proxy_pass http://127.0.0.1:8000;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Port $server_port;
}

而 PyWebScrapBook 可設定如下:

[app]
...
allowed_x_for = 1
allowed_x_proto = 1
allowed_x_host = 1
allowed_x_port = 1
allowed_x_prefix = 0

示例 2

假設 https://example.com/ 由 nginx 託管,且會把 https://example.com/scrapbooks/ 代理給託管 http://127.0.0.1:8000/ 的 PyWebScrapBook 伺服器,則 nginx 伺服器可設定以下標頭:

location /scrapbooks/ {
  rewrite ^/scrapbooks/(.*)$ /$1 break;
  proxy_pass http://127.0.0.1:8000;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Port $server_port;
  proxy_set_header X-Forwarded-Prefix /scrapbooks;
}

而 PyWebScrapBook 可設定如下:

[app]
...
allowed_x_for = 1
allowed_x_proto = 1
allowed_x_host = 1
allowed_x_port = 1
allowed_x_prefix = 1