所谓“坑”,只不过是在没有完全了解一个事物的情况,就贸然出手的导致的错误。所以,只要以形而上的方法了解一个事物,就没有所谓的“坑”,有的可能只是IQ不够了。
——高佳羽
已经在互联网行业呆了这么久了,还真没有好好玩过Apache httpd。最近接了一个活,涉及到配置httpd的RewriteRule。由于之前没有系统地了解过这块,结果踩了个小坑了。
之前是看到文件里边有这样两种配置:
RewriteRule ^/test1.js$ http://localhost/jss/jquery.min.js [P] RewriteRule ^/test2.js$ /jss/jquery.min.js [P]
问OPS同学,这样写有啥区别,被告知没有区别。将信将疑,配置好了开始测试,结果就发现了很诡异的问题。
这台机器配置了域名,比如:test.alibaba.com,可以下面两个URL,一个可以正常访问,一个确不可能。
http://test.alibaba.com/test1.js 正常
http://test.alibaba.com/test2.js 浏览器中看到如下错误:
The proxy server received an invalid response from an upstream server. The proxy server could not handle the request GET /jss/jquery.min.js. Reason: DNS lookup failure for: test.alibaba.com.com这是怎么回事儿?看了一下,发现这台机器虽然可以通过test.alibaba.com来访问,但是它本身所使用的DNS其实解析不了test.alibaba.com这个域名。
[P]标志会让mod_rewrite通过mod_proxy去代理地访问rewrite过后的URL所指向的资源,虽然是指向本机(其实这里完全可以用[PT]或者直接[L]来代替,具体原因,看mod_rewrite相关文档吧,这里只讲这个“坑”),但是mod_rewrite还是会做一次内部重定向。
而当我们写明是http://localhost/的时候,mod_proxy就会直接访问这个localhost;可是当我们没有给出host的时候,mod_rewrite,会将原始http请求中的host拼接上去,再访问。上面的例子中,就会变成http://test.alibaba.com/jss/jquery.min.js。这就要求,这台机器本身也需要能解析test.alibaba.com,否则就会报上错误。最后我通过把[P],改成[L],解决了此问题。注意:发成[L],还是改成[PT],还是要补一个http://localhost,这还要看你的rewrite的需求。
这个坑算描述完了吧。
发现在在维护的这个应用,rewrite规则乱得已经快成一坨屎,再不整理,踩坑是早晚的事儿