什么会导致Goutte驱动程序不遵循重定向?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么会导致Goutte驱动程序不遵循重定向?相关的知识,希望对你有一定的参考价值。
我有一个phpUnit Mink测试,确保一些HTTP重定向到位。
这是削减,但测试基本上看起来像testRedirect()
由@dataProvider
喂:
class Testbase extends BrowserTestCase {
public static $browsers = [
[
'driver' => 'goutte',
],
];
public function testRedirect($from, $to) {
$session = $this->getSession();
$session->visit($from);
$this->assertEquals(200, $session->getDriver()->getStatusCode(), sprintf('Final destination from %s was a 200', $to));
$this->assertEquals($to, $session->getCurrentUrl(), sprintf('Redirected from %s to %s', $from, $to));
}
}
这适用于在Web服务器本身处理的重定向(例如,mod_rewrite)。但是,我需要检查的一些重定向是由DNS提供程序处理的(我不控制它,但我认为它是NetNames)。
如果我用wget测试重定向,它看起来很好
$ wget --max-redirect=0 http://example1.com/
Resolving example1.com... A.B.C.D
Connecting to example1.com|A.B.C.D|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://example2.com/some/path?foo=bar [following]
0 redirections exceeded.
但是,当我从测试中转储响应时,标题是
Date: Thu, 06 Sep 2018 15:37:47 GMT
Content-Length: 94
X-Powered-By: Servlet/2.4 JSP/2.0
而且回应是
<head>
<title></title>
<meta name="revised" content="1.1.7">
</head>
<body></body>
拥有200状态代码。
我是否需要明确设置请求标头?我试过了
$session->setRequestHeader('Host', 'example1.com');
但这没有帮助。
是什么导致这个?
答案
事实证明,在接收端,主机头是一个奇怪的情况。
我的测试提供程序有一些主机名,其中包含大写字符,例如“http://Example1.com/”。我不得不更新测试功能
public function testRedirect($from, $to) {
$parts = parse_url($from);
$host = strtolower($parts['host']);
$session = $this->getSession();
$session->setRequestHeader('Host', $host);
$session->visit($from);
$this->assertEquals(200, $session->getDriver()->getStatusCode(), sprintf('Final destination from %s was a 200', $to));
$this->assertEquals($to, $session->getCurrentUrl(), sprintf('Redirected from %s to %s', $from, $to));
}
强制Host标头为小写。
以上是关于什么会导致Goutte驱动程序不遵循重定向?的主要内容,如果未能解决你的问题,请参考以下文章