我有 plesk 系統來管理網站
會用 api 去抓取 domain 等內容
# ↓ 基本 curl 範例:查詢支援的 XML API 版本
cat > request.xml <<'EOF'
<packet>
<server>
<get_protos/>
</server>
</packet>
EOF
curl -k -sS \
-X POST "https://PLESK_HOST:8443/enterprise/control/agent.php" \
-H "Content-Type: text/xml" \
-H "HTTP_AUTH_LOGIN: admin" \
-H "HTTP_AUTH_PASSWD: your_password" \
--data-binary @request.xml
正常的話應該回
<packet version="...">
<server>
<get_protos>
<result>
<status>ok</status>
<protos>
<proto>...</proto>
</protos>
</result>
</get_protos>
</server>
</packet>
但偏偏是 Wrong request
<?xml version="1.0"?> <packet version="0.0.0.0"> <system> <status>error</status> <errcode>1003</errcode> <errtext>Wrong request</errtext> </system> </packet>
想不通 ?
網路問題 ? 但偏偏就剛好是同一網段,其它網段卻沒有問題,查到快吐血!
問過原廠,但也只會叫我更新版本、或給他們最高存取權限
各大網路都找不到相關問題,在 ai 還沒出來之前的事了
像下面有提到 curl 301 會換成 GET 而不是 POST,誰會去想到是 hostname 的問題 !
ai 跟我說 ↓
1003 Wrong request 通常代表 Plesk 收到的 XML request body 不符合 XML API 格式,不是單純帳密錯。Plesk 官方文件說 XML API 要把「操作 XML」放在 HTTP body,並送到 https://<host>:8443/enterprise/control/agent.php,同時用 HTTP_AUTH_LOGIN / HTTP_AUTH_PASSWD headers 帶認證資訊。
你這裡還有一個可疑點:packet version=”0.0.0.0″。這通常不是正常 request 應該使用的版本。官方範例常見是省略 version,或使用支援版本,例如 1.6.x.x;也可以先用 server/get_protos 查詢支援版本。
請特別檢查這幾點:
不要送空 body
很常見的是 curl 指令少了 –data-binary @request.xml,Plesk 就會回 Wrong request。
不要把 response 當 request 再送回去
你貼的這段是 Plesk 的錯誤 response,不是可以拿來送的 request。
先移除 version=”0.0.0.0″確認 XML 裡有合法 operator
用 –data-binary,不要用 -d 處理複雜 XML
等等
後來我把 curl 加入 -L -v ,然把完整訊息給 ai 看
問題幾乎確定出在 -L 跟 301 redirect。
你原本打的是:
https://33.33.33.33:8443/enterprise/control/agent.php
Plesk 回:
HTTP/2 301
location: https://xxx33-33.wow.com:8443/enterprise/control/agent.php然後因為你用了 -L,curl 會跟著 redirect 到新網址。對 301/302/303 redirect,curl 可能會把後續 request 改成 GET,或至少不保證完整保留原本的 POST body;這會讓 Plesk 收到「沒有 XML body 的錯誤 request」,所以回 1003 Wrong request。curl 官方文件也說明,301/302/303 redirect 後可能切換成 GET;若要保留 POST method,要用 –post301、–post302、–post303。
請直接改打 redirect 後的 hostname,不要用 IP + -L
所以結論就是 curl 要直接打 -L 最後看到 301 redirect 的 host
就是一個這麼簡單的問題
留言