来自 Apache 服务器的奇怪 302 响应

来自 Apache 服务器的奇怪 302 响应

我遇到了这种情况,令我非常困惑:

设置

一个新设置的服务器(centos 7、apache、mysql,没什么特别的),它托管了一个简单的 php 应用程序,我需要从另一台服务器上的主应用程序与它进行交互。此服务设置为在 service-name.domain.tld 上运行,而主应用程序在 domain.tld 上(只是提一下,以防万一有区别)。

问题

由于某种原因,当我尝试从主服务器访问服务应用程序时,出现了 302 重定向的无限循环。

curl -D - http://service-name.domain.tld如果我从主服务器执行,我会得到:

HTTP/1.1 302 Found
Date: Wed, 03 Aug 2016 12:30:26 GMT
Server: Apache
Location: http://service-name.domain.tld
Content-Length: 218
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://email-blasts.upgradesale.co">here</a>.</p>
</body></html>

如果我从电脑上执行同样的命令,结果是

HTTP/1.1 200 OK
Date: Wed, 03 Aug 2016 12:31:39 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.6.24
X-Powered-By: PHP/5.6.24
Cache-Control: no-cache
Content-Length: 30
Content-Type: text/html; charset=UTF-8
Welcome.

应该如此。我发出的任何请求(甚至是静态文件)都会发生同样的情况。此外,我应该指定php 中的wget和也会发生同样的情况get_file_contents

我现在真的很迷茫,不知道接下来该去哪里。所以非常感谢任何指引。

更新 #1:

我应该提到,这两台服务器不在同一网络上。主应用程序托管在 LiquidWeb 上,新服务器托管在 Linode 上。

另外,为了将子域指向 Linode 服务器,我在 CPanel 的 DNS 编辑器中创建了 A 记录。

从 domain.tld 服务器运行 ping 得到以下结果:

64 bytes from li1014-180.members.linode.com (xx.xx.xx.xxx): icmp_seq=1 ttl=64 time=0.022 ms

来自我本地计算机的相同命令:

64 bytes from (xx.xx.xx.xxx): icmp_seq=0 ttl=52 time=114.982 ms

按照 Damiano 的说明运行 tcpdump 后,我发现来自主服务器的请求没有到达新服务器,相反,主服务器似乎也做出了响应。任务仍在继续,以找出原因。

此外,主服务器正在运行 CPanel,所以这可能与此有关......

更新2

sudo tcpdump -n -i eth0 icmp在服务服务器上运行时,如果我ping service-name.domain.tld从本地机器上,我可以看到服务器上进出的流量,但是从主服务器运行相同的命令在服务服务器上没有任何结果(如果我使用 tcpdump 过滤 http 流量并发出 curl 请求,情况也是如此)。

更新 3

我放弃了,克隆了 Linode,获得了一个新的 IP,现在它运行良好……¯_(ツ)_/¯

答案1

您询问“方向”,因此...这是我的。

在你的两份记录中,我看到第一份是这样的:

[...]
Server: Apache
[...]

第二个是这样的:

[...]
Server: Apache/2.4.6 (CentOS) PHP/5.6.24
[...]

尽管这是两个不同的 HTTP 响应(302 Found第一个;200 OK第二个),我敢打赌这两个响应来自不同的网络服务器。那么让我们尝试调查一下这样的假设……

作为第一步,正如 @HBruijn 评论中提到的,我们需要确保两个 HTTP 客户端都打开了与同一 HTTP 服务器的 HTTP 连接。请在每个客户端上运行:

ping service-name.domain.tld

并确保在输出中您看到的是相同的 IP 地址。如果不是,我们就此打住……由您决定是否继续处理其他问题 :-)

如果两者都ping解析为相同的 IP 地址,那么故障排除过程确实会有所不同,这取决于三台主机的“相对”位置:“客户端 A”和“客户端 B”是否连接到同一个以太网 LAN / 网段?“服务器 C”是否连接到同一个以太网 LAN / 网段?

如果三台机器连接到同一个 LAN,那么需要检查的可能是“客户端 A”和“客户端 B”从“服务器 C”IP 地址的 ARP 解析中获得的 MAC 地址。在 PING 之后(在“客户端 A”和“客户端 B”与“服务器 C”上),运行(在“客户端 A”和“客户端 B”上)arp -an <ip.of.server.c>。您将得到类似以下内容:

verzulli@iMac-Chiara:~$ ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
[...]
verzulli@iMac-Chiara:~$ arp -an 192.168.2.1
? (192.168.2.1) associato a c0:c1:c0:e8:0f:12 [ether] su wlan0
verzulli@iMac-Chiara:~$

上面可以看到我的“服务器”(192.168.2.1)的 MAC 地址是c0:c1:c0:e8:0f:12。对于你的情况,请确保“客户端 A”和“客户端 B”的 MAC 地址相同。再次注意仅当客户端 A 和客户端 B 与服务器 C 位于同一以太网段时,此方法才有效

如果“客户端 A”和“客户端 B”位于不同的网络上,并且/或者“服务器 C”距离它们很远,那么我们唯一的机会就是在“客户端 A”和“客户端 B”都尝试访问“服务器 C”时检查到达“服务器 C”的情况。不幸的是,这里我们也有根据三个主机的相对位置而采用不同方法的方法。让我们假设最坏的情况:“客户端 A”和“客户端 B”连接到两个不同的 LAN(可能是大公司的两个远程站点),而“服务器 C”连接到第三个站点(大公司总部)。当到达“服务器 C”时,“客户端 A”和“客户端 B”都经过了 NAT。

在这种情况下,我们需要发现到达“服务器 C”时分配给“客户端 A”和“客户端 B”的“公共” IP 地址。有很多方法可以获取此信息。作为一种快速(...而且非常肮脏)获取结果的方法,您可以启动:

verzulli@iMac-Chiara:~$ curl -s http://ipinfo.io | grep '"ip":'
  "ip": "2.239.77.181",

您可以在其中看到我的 NAT 地址(当我的主机离开其网络时由我的提供商分配给我的主机)是2.239.77.181

所以,现在,我终于可以要求“服务器 C”向我显示来自我的 IP 的流量了……只需观察是否真的有东西进入。

在服务器上:

[root@srv-01 ~]# tcpdump -n -i eth0 host 2.239.77.181 and icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

它将....开始等待来自 2.239.77.181 的传入 icmp (ping) 数据包。一旦我从客户端 PING,就会显示此类数据包:

[root@srv-01 ~]# tcpdump -n -i eth0 host 2.239.77.181 and icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:28:21.031355 IP 2.239.77.181 > 78.47.127.152: ICMP echo request, id 60237, seq 1, length 64
16:28:21.031392 IP 78.47.127.152 > 2.239.77.181: ICMP echo reply, id 60237, seq 1, length 64

您可以看到来自我的客户端的 PING(icmp echo 请求)以及来自服务器的答复(icmp echo 回复)。

如果您希望检查每种类型的流量(而不仅仅是 ICMP),您可以尝试(在“服务器 C”上):

tcpdump -n -i eth0 host 2.239.77.181

如果你只想检查 HTTP 流量:

tcpdump -n -i eth0 host 2.239.77.181 and port 80

就这样。

基于以上内容,您应该能够检查“客户端 A”和“客户端 B”是否都访问了您的“服务器 C”(而不是两个不同的 Web 服务器)。获取此信息后,请返回此处确认这一点,然后...我可以更新此答案以进行跨步操作。

相关内容