我正在尝试对URL进行curl
POST,这可能会导致一系列重定向(301)到受BASIC身份验证保护的实际URL。事实证明-L
选项在这种情况下无济于事,我想我会尝试编写一个带有递归函数的特定于案例的shell脚本,只是为了证明这个概念。这是脚本:
#!/bin/sh
WORK_DIR=/some/dir
MY_URL=http://redirect.me/some/service
MY_FILE=output.bin
follow_redirect() {
echo "Input URL is $1"
local status_code="$(curl -s -X POST --data-binary @${WORK_DIR}/postdata.txt -u myuser:mypass \
-o ${WORK_DIR}/${MY_FILE} -D ${WORK_DIR}/headers.out -w "%{http_code}" "$1" --header "X-Custom-Header:Whatever")"
echo "Status code is $status_code"
if [ $status_code -eq "301" ]; then
# extract Location header value
local loc_line="$(cat ${WORK_DIR}/headers.out | grep Location)"
local sub_url=${loc_line:10}
echo "HTTP redirect to: $sub_url"
follow_redirect "$sub_url"
elif [ $status_code -eq "200" ]; then
echo "HTTP OK"
return
else
echo "HTTP request failed"
return
fi
}
# do the call
follow_redirect "$MY_URL"
简短描述:想法是尝试进行调用,并获取状态代码。如果代码是301,则执行递归调用,传入以前从Location
标头中提取的新URL(标头被转储到临时文件中,如可以看到的)。
我得到的是输出结果:
Input URL is http://redirect.me/some/service
Status code is 301
HTTP redirect to: http://actual.url/some/service
Input URL is http://actual.url/some/service
Status code is 000
HTTP request failed
出于某种原因,第一次递归curl
调用失败,状态代码为000
,就好像我传入了一个空输入网址,或者其他内容(但输入网址实际打印得正确)。我还尝试用硬编码值替换所有参数化文件系统路径,以确保它不是那里的东西,但结果是相同的。我在这里做错了什么想法......?
答案 0 :(得分:0)
实际上,仅使用curl
似乎解决了这个问题,不仅指定了--location-trusted
而且还指定了--post301
,以便保留原始POST请求,使其不会被转换在重定向时获取。
- 减