2013-11-22 51 views
0

我想调试一个HTTP请求,在我们的服务器上产生一个错误。但是,我努力以某种方式重现确切的请求。模拟一个HTTP请求与卷曲

在我nginx的日志,我看到它产生的误差

157.55.33.20 - - [22/Nov/2013:04:06:22 +0000] "GET /en/library/search?utf8=\xE2\x9C\x93&q=something HTTP/1.1" 500 0 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" "-"

然而此项,尝试使用相同的字符串使用curlhttpie产生类似的日志条目:

GET /en/library/search?utf8=\x5CxE2\x5Cx9C\x5Cx93&q=something

GET /en/library/search?utf8=xE2x9Cx93&q=something

GET /en/library/search?utf8=%5CxE2%5Cx9C%5Cx93&q=something

我似乎无法重现完全相同的请求。我尝试了各种命令行参数,但无法弄清楚这一点。

关于如何重现完全相同的请求的任何建议?

回答

1

您可以使用telnet更自由地创建HTTP请求。要启动连接,请在命令行键入以下内容:

telnet www.example.com 80 

(这里,80对应于HTTP请求的端口号)。一旦你连接,你会看到这样的消息:

Trying 12.34.56.78... 
Connected to www.example.com. 
Escape character is '^]'. 

然后,您可以输入您的请求,例如:

GET /en/library/search?utf8=\xE2\x9C\x93&q=something HTTP/1.1 
Host: www.example.com 
User-Agent: Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

完成与两个回车标记的结束头。

编辑: lcornea的建议也值得考虑。如果您的命令行终端 接受UTF8(输入echo $LANG查找),则键入(或粘贴)字符✓ (复选标记)而不是三个转义字符。或者在Windows Latin-1终端上, 改为输入“œ”。

+0

由于网站使用的是SSL,我使用'openssl s_client',在我的nginx日志答案中:'GET/en/library/search?utf8 = \ x5CxE2 \ x5Cx9C \ x5Cx93&q = something' – gingerlime

+0

第二个建议虽然做到了! 'curl'https://my.website.com/en/library/search?utf8 =✓&q = something''再现了这个问题。谢谢!! – gingerlime

0

而不是\xYZ使用%YZ它会是一样的。例如在CURL请求中将\xE2替换为%E2

+0

谢谢。我试了一下,但日志显示'GET/en/library/search?utf8 =%E2%9C%93' – gingerlime

2

它在我看来是\ xE2 \ x9C \ x93是由您的服务器重新编码以便能够将它们放入日志中的实际UTF8字符。也许看看这些字符实际上是在UTF8中,然后将这些字符放在URL中。

希望它可以帮助

+0

是的,这就是我想要弄明白的。如何模拟相同的请求,因此我的问题。 – gingerlime

+0

感谢您的建议。它帮助@squeamish ossifrage给出了完整的答案。 – gingerlime

+0

@Yoav Aner我很高兴我的回答帮助你给出了全面的回应。你的回应是非常好的工作。 – lcornea