`wget`-將網站設定為在不同網域上進行「本地」瀏覽

`wget`-將網站設定為在不同網域上進行「本地」瀏覽

我需要鏡像一個網站並將副本部署在不同的網域下。鏡像過程應該是自動的,這樣我就可以定期使用cron.

鏡像不能是真正的鏡像,但它必須是靜態副本,例如特定時間站點的快照,所以我認為wget可能合適。

到目前為止,我已經提出了以下腳本來獲取原始網站的副本:

#!/bin/bash

DOMAIN="example.com"

cd /srv/mirrors
TMPDIR=$(mktemp -p . -d)
cd "${TMPDIR}"

wget -m -p -E --tries=10 --convert-links --retry-connrefused "${DOMAIN}"

cd ..
rm -rf oldcopy
mv "${DOMAIN}" oldcopy
mv "${TMPDIR}/${DOMAIN}" "${DOMAIN}"
rmdir "${TMPDIR}"

然後,Nginx 在新網域下將生成的副本帶給您,並進行了本地靜態網站的簡單配置,並且似乎可以正常工作。

問題是原始伺服器生成的網頁中包含絕對鏈接,即使連結指向內部資源也是如此。例如,頁麵https://example.com/page1包含

<link rel="stylesheet" href="https://example.com/style.css">
<script src="https://example.com/ui.js"/>

等等(這是WordPress)。我無法改變這種行為。wgetthen 不會將這些連結轉換為本地瀏覽,因為它們是絕對的(或至少我認為這是原因)。

編輯:真正的網域是 assodigitale.it,儘管我需要一個無論特定網域如何都可以工作的腳本,因為我也需要它用於其他一些網域。

我可以將wget這些連結轉換為新網域嗎?

答案1

您的問題還有另一種解決方案。

您可以讓您的網站伺服器動態重寫鏈接,而不是讓 wget 將這些連結轉換為新網域。

使用apache,您可以使用mod_sed來重寫連結。

例如:

AddOutputFilter Sed html OutputSed "s/example.com/newdomain.com/g"

https://httpd.apache.org/docs/trunk/mod/mod_sed.html

答案2

這可能是混合內容問題還是與同時使用 HTTP 和 HTTPS 協定有關?

可能是您正在使用 HTTP 進行鏡像

DOMAIN="example.com"
wget -m -p -E --tries=10 --convert-links --retry-connrefused "${DOMAIN}"

而上述要轉換的 URL 是絕對 HTTPS URL:

<link rel="stylesheet" href="https://example.com/style.css">
<script src="https://example.com/ui.js"/>

連結轉換是命令的最後一個階段,它應該向您顯示提供有關轉換過程的詳細資訊的行。這只是使用命令鏡像一頁的範例:

Downloaded: 177 files, 12M in 0.2s (51.0 MB/s)
Converting links in example.com/index.html... 45-2
...
Converted links in 15 files in 0.008 seconds.

只有最後 wget 才會知道已下載的內容,並將其知道的所有連結(來自此下載歷史記錄)轉換為現有檔案的相對路徑。雖然 wget 能夠使用 HTTP 檢索內容,但使用 HTTPS 時可能會失敗。

嘗試這個:

DOMAIN="example.com"
wget -m -p -E --tries=10 --convert-links --retry-connrefused https://"${DOMAIN}"

它可能會起作用,也可能會給出一個錯誤,幫助您解決實際問題。

相關內容