2015年(68)
分类: LINUX
2015-08-31 17:03:17
一、结构
很简单,前面一个nginx做代理,后端webserver为tomcat,tomcat下有一与ROOT目录同级的名为solr的目录
二、nginx 配置
server {
listen 7070;
server_name 172.16.2.7;
charset utf-8;
access_log logs/access.log main;
location / {
proxy_pass /> }
}
三、问题
访问带目录的URLl不加斜线“/”时失败,如下图
如果加上斜线刚可以正常访问
四、问题处理过程
根据以前的经验,出现这种情况,可以用一些如httpwatch、frirebug等工具来看看在请求与响应该之间发生什么事情,我用了更方便的curl:
C:\>curl.exe -I
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Fri, 16 Sep 2011 06:05:35 GMT
Connection: keep-alive
Location:
看到当访问时被重定向到了;google了一下,原来当 URL 指向一个目录并且在最后没有包含/时ginx会自动在请求的最后加上一个/;通过上面的curl输出可以得知这个/是通过重定向来加上的,但按理说应该重定向到/才对,为什么重定向时会少了端口号呢?行,既然没有,那我就手动给你加上吧,于是在location下加上了这一段:
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ permanent;
}
测试:
C:\>curl.exe -I
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Fri, 16 Sep 2011 06:28:07 GMT
Connection: keep-alive
Location:
还是重定向到了 。等等,我在nginx上设置的是permanent永久重定向,返回的http code应该是301才对,但上面的curl返回却是302,莫非这个重定向的响应不是nginx而是后端的tomcat返回的?这得测测:
nginx:
C:\>curl.exe -I
HTTP/1.1 301 Moved Permanently
Server: nginx/1.1.3
Date: Fri, 16 Sep 2011 06:42:01 GMT
Content-Type: text/html
Content-Length: 184
Location: /
Connection: keep-alive
tomcat:
C:\>curl.exe -I
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: /
Transfer-Encoding: chunked
Date: Fri, 16 Sep 2011 06:40:12 GMT
果然,nginx返回的是301,而tomcat返回的是302,可以确定这个重定向的响应是后端的tomcat返回组客户端的了,只要nginx把端口正确的传递给后端的tomcat,访问就会正常的重定向了:
server {
listen 7070;
server_name 172.16.2.7;
charset utf-8;
access_log logs/access.log main;
location / {
proxy_pass
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Referer $http_referer;
}
}
测试:
C:\>curl.exe -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.1.3
Date: Fri, 16 Sep 2011 06:44:46 GMT
Connection: keep-alive
Location: /
可以看到已经可以正常访问