什么会导致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驱动程序不遵循重定向?的主要内容,如果未能解决你的问题,请参考以下文章

为啥浏览器不遵循使用 XMLHTTPRequest 和 CORS 的重定向?

PHPs fopen 会遵循 301 重定向吗?

Nginx:是啥导致了这个 301 重定向?

web.config 重定向到 https 导致重定向循环

Android 4.4.3 网络视图不再遵循重定向

如何让 System.Net.Http.HttpClient 不遵循 302 重定向?