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

我有这种情况完全让我感到困惑:

设置

一个新设置的服务器(centos 7,apache,mysql,没什么奇怪的),它提供了一个简单的php应用程序,我需要在另一台服务器上与我的主应用程序进行交互。 这个服务被设置为在service.name.domain.tld上运行,而主应用程序在domain.tld上(只是提及以防万一)。

问题

由于某些原因,当我尝试从主服务器访问服务应用程序时,我得到了一个无限循环的302redirect。

如果我从主服务器上执行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中的wgetget_file_contents

我现在真的迷失了,不知道从哪里出发。 所以任何一种方向都非常感激。

更新#1:

我应该提到2台服务器不在同一个networking上。 主应用程序托pipe在LiquidWeb上,新服务器在Linode上。

同样为了将子域指向Linode服务器,我在CPanel的DNS编辑器中创build了一个Alogging。

从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

按照达米亚诺的指示运行tcpdump,我发现主服务器的请求没有到达新的服务器,而是似乎主服务器也响应。 任务继续找出原因。

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

更新2

在服务服务器上运行sudo tcpdump -n -i eth0 icmp时,如果从本地计算机ping service-name.domain.tld ,则可以看到服务器上的stream量进出,但是从主服务器运行相同的命令服务器在服务器上不给我任何东西(如果我使用tcpdump过滤HTTPstream量并发出curl请求,也是如此)。

更新3

我放弃了克隆Linode,得到了一个新的IP,现在它工作正常…¯_(ツ)_ /¯

你问“方向”,所以…这是我的。

在你的两个成绩单中,我看到了第一个成绩单:

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

在第二个,这个:

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

即使是那些两个不同的HTTP响应( 302 Found第一个, 200 OK第二个),我敢打赌,这两个响应来自不同的 Web服务器。 所以我们试着去调查这样一个假设…

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

ping service-name.domain.tld

并确保在输出中看到相同的IP地址。 如果不是的话,让我们在这里停下来,并且…在不同的问题上向前迈进:-)

如果两个pingparsing为相同的IP地址,那么故障排除过程实际上是不同的,根据三台主机的“相对”位置:“客户端A”和“客户端B”是否连接到同一个以太网LAN /网段? 是“服务器C”连接到同一个以太网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”都是一样的。 请再次注意, 只有当客户端A和客户端B位于服务器C的同一个以太网段时,才有效

如果“客户端A”和“客户端B”在不同的networking上和/或“服务器C”远离他们,那么我们唯一的机会是当“客户端A”和“客户端B”都检查到“服务器C” “试图达到它。 不幸的是,在这里我们也有不同的方法,取决于三个主机的相对位置。 让我们假设最坏的情况:连接到两个不同的局域网(可能是一个大公司的两个远程站点)的“客户端A”和“客户端B”连接到第三个站点(大公司总部) 。 当到达“服务器C”时,“客户端A”和“客户端B”都被NAT。

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

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

在那里你可以看到我的NAT地址(由我的提供商分配给我的主机离开它的networking时)是2.239.77.181

所以,现在我终于可以请求“服务器C”向我展示来自我的IP的stream量,并且……只要注意是否真的有什么东西进来。

在服务器上:

 [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 request)以及来自服务器的响应(icmp echo reply)。

如果你喜欢检查每种stream量(而不仅仅是ICMP),你可以尝试(在“服务器C”上):

 tcpdump -n -i eth0 host 2.239.77.181 

的,如果你只想检查HTTPstream量:

 tcpdump -n -i eth0 host 2.239.77.181 and port 80 

就这样。

根据以上所述,您应该能够检查“客户端A”和“客户端B”是否到达“服务器C”(而不是两个不同的Web服务器)。 一旦得到这个信息,回到这里确认这一点,我可以更新这个答案一步。