当我输入命令时:
$curl -basic https://www.google.com$
我收到的输出只是我们访问网站时看到的 html 页面的文本。
但是当我执行时:
$curl -basic https://www.yahoo.com$
我没有收到任何输出,并且我的终端中的域从 更改username@computer_name
为Regional Redirectusername@computername
。
这是什么意思?我对此感到不舒服,因为我一直以为我所做的是发送请求以接收 www 域索引页上的基于文本的内容。如果这个问题太模糊,我很抱歉,但我肯定想知道这里有什么区别。
提前致谢
答案1
您应该知道,添加选项时-basic
实际上设置了多个参数。您可能想要执行的是--basic
基本身份验证。而且最后的$
符号可能是拼写错误。
如果您执行以下操作,是否会得到相同的意外行为?
curl https://www.yahoo.com
答案2
如果您需要始终获取 HTML 结果,我建议使用 curl 标志“-L”:
curl -L yahoo.com
或者
curl -L https://www.yahoo.com
此标志强制 curl 遵循所有 URL 重定向(图形浏览器行为)。如果网站多次重定向您,例如重定向到区域版本,您始终有机会获得最终 HTML。
来自 curl man:
-L,--位置
(HTTP)如果服务器报告请求的页面已移至其他位置(用 Location: 标头和 3XX 响应代码表示),此选项将使 curl 在新位置重新执行请求。如果与 -i、--include 或 -I、--head 一起使用,将显示所有请求页面的标头。使用身份验证时,curl 仅将其凭据发送到初始主机。如果重定向将 curl 带到其他主机,它将无法拦截用户+密码。另请参阅 --location-trusted 了解如何更改这一点。您可以使用 --max-redirs 选项限制要遵循的重定向数量。
当 curl 遵循重定向并且请求不是普通的 GET(例如 POST 或 PUT)时,如果 HTTP 响应是 301、302 或 303,它将使用 GET 执行以下请求。如果响应代码是任何其他 3xx 代码,curl 将使用相同的未修改的方法重新发送以下请求。
您可以使用专用选项 --post301、--post302 和 --post303 告诉 curl 在 30x 响应后不要将非 GET 请求方法更改为 GET。