又一次开始了Jenkins征程,其实以前我就遇到了这个问题,如图

你说你报这个错误鬼知道是为什么,当然了,我们也不能太苛求,Jenkins怎么可能知道具体是什么问题呢?算啦,我们自己去看Jenkins的日志吧,我发现

WARNING: http://jenkins.tangxuyang.cn/manage vs. http:

然后又结合chrome的F12,如下

就是这个请求没有正确的返回让Jenkins认为反向代理有问题,我也不知道这个会不会有什么影响,但是作为一个处女座,总归是看不得这种错误的。其实此时我已经不知道怎么搞了。因为我完全不知道Jenkins的原理。我就把不能正常返回的url贴到chrome中访问一下,得到如下的错误:

跟上面Jenkins日志是一致的。不过此时我还是不了解是啥意思。知道我尝试改了url中的后面的一点东西,我发现报的错有变化,vs.后面的内容随着变了。至此我猜测,Jenkins是用传过去的值跟http://jenkins.tangxuyang.cn/manage比较,好吧其实看到vs.也能想到是比较,算我笨吧。以下是url

http://jenkins.tangxuyang.cn/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/http%3A%2F%2Fjenkins.tangxuyang.cn%2Fmanage/

我们可以看到最后面一部分http%3A%2F%2Fjenkins.tangxuyang.cn%2Fmanage/,其实就是http://jenkins.tangxuyang.cn/manage,这是浏览器中把冒号:和斜杠/转义了,但是Jenkins只接收到了http:,后面的统统没收到,我的天呀!

起初我觉得是Jenkins的问题,我在网上也确实搜到了有人跟我遇到一样的问题,不过他们是IIS下的。当然了,他们只是在Jenkins官网提了Bug并没有人解决。我又继续找。找不到。

后来我萌发了一个想法,我想看看Nginx究竟转发的是哪个地址,因此我写了一个简单的node程序,用来暂时替换Jenkins,就是为了打印出Nginx转发的地址

var express = require('express');
var app = new express();
app.get('*', function(req,res){
    console.log(req.url);
    res.end(req.url);
});
app.listen(8080);

让人抓狂的事情发生了,http://jenkins.tangxuyang.cn/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/http:/jenkins.tangxuyang.cn/manage/,这是Nginx转发后的url,仔细看发现最后一部分变成了http:/jenkins.tangxuyang.cn/manage,http://变成了http:/,少了个斜杠,这是什么鬼。果然是Nginx惹的祸。我又做了一些尝试,发现Nginx会把url中(不含querystring部分)多个斜杠合并成一个,比如http://www.baidu.com//hello//world,到nginx那边就变成了http://www.baidu.com/hello/world。在网上找了好久都没有解决方案。在要绝望的时候,我搜到了这个https://stackoverflow.com/questions/4320774/nginx-how-to-keep-double-slashes-in-urls/11918103#11918103

上面说配置一下merge_slash off就好了,这样就不会合并slash了。我做了尝试,然而并不行,就在我要放弃的时候,我在该文章底下的评论里发下了一个不起眼的回复,我天原来大神在底下,请看

我抱着试试的心态,把转发的地址后面的斜杠去掉了,然后真的就好了!!我啥也不想说了,只能说自己Nginx是二把刀!

在这里感谢方案提供者,虽然他也不一定能看懂中文,也不一定知道帮助了我。

总结下来就是把Nginx中转发的配置中最后的斜杠干掉,就这么简单。我折腾了一下午,酸爽:(

注:为了让大家能看清楚,我把没有隐去我的服务器地址,请大家放过它,不要攻击

如果有帮到你,请给我点个赞^_^

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐