nginx location匹配后proxy_pass给后端server后404 一探
我们先来看如下一段nginx配置
location /zentaopms {
proxy_pass http://127.0.0.1:8282;
}
location /zentaopms {
proxy_pass http://127.0.0.1:8282/;
}
server {
listen 8282;
root /home/www/zentaopms/www/;
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
如上代码中location节点proxy_pass 后相差一个/
我们来看一个具体demo
step1-我们要访问一个URL
http://somehost/zentaopms/index.php
这其实是禅道的首页-
step2-如我们使用这个配置节
location /zentaopms { proxy_pass http://127.0.0.1:8282; }
那么nginx的错误日志里面记录的都是404的错误
step3-为什么会发生404
首先location匹配到后将请求代理到后端8282端口的server,代理到8282 server还是原先的url,此时到了8282 的server,8282server去/home/www/zentaopms/www/zentaopms/下找index.php并由fastcgi协议传送至php中执行,但index.php是在www目录下,因此nginx就直接报404错误
step4- / ‘斜杠’
使用了proxy_pass http://127.0.0.1:8282/;
,在最后多了一个/,代表绝对根目录,nginx不会将location中匹配到的路径代理走。因此代理到8282 server时,路径变成了 http://somehost/index.php,这样子交由server 8282去执行,可以找到php文件。
author:tomato
qq:385817098
tel:********
job:php程序员
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。