记一次nginx php配置的心路历程

1.本来搞好了php的配置,想把目录下移一层 从 www.abc.com 变成 www.abc.com/wxapi ,由于我的真实文件目录比路由少了一层public 尝试了很多办法都不行 甚至想到了upstream+proxy_pass 但由于是内部转发会导致获取request url路径出问题。

例如我的路径是 www.abc.com/wxapi 想获取 /wxapi/public/index.php 用nginx各种正则也无法匹配对。因为$fastcgi_script_name 这里直接就是/wxapi/info.php,不能在中间硬插一个路径

在将近花费半天后 终于搞定 。终于搞清了fastcgi是如何匹配的
1.获取变量\(fastcgi_script_name 2.用正则匹配出不含子路径/wxapi/的变量 3.拼接出真实的script_name地址。 #\)real_script_name
4.这样fastcgi就可以解析最后的\(doucument_root/\)real_script_name 文件了
贴下代码

location /wxapi/ {
alias /usr/local/www/wxapi/public/;
index index.php index.html index.htm;
try_files $uri \(uri/ index.php\)is_args$args;
}
# location ~ .php {
# echo 'fuck';
# }
location ~ ^/wxapi/.*.php {
# 设置文件根路径
root /usr/local/www/wxapi/public/;
include fastcgi_params;
set $path_info "";
set $real_script_name \(fastcgi_script_name; ##正则匹配URI,若能匹配将产生两个子组 if (\)fastcgi_script_name ~ "^(/wxapi/)(.+?.php)(/.+)?$") {
##将两个子组赋值给刚生成的两个nginx变量
set $real_script_name \(2; #拼接出真实的script_name地址。 #\)real_script_name
set $path_info \(3; #支持pathinfo参数 } # echo "real_script_name----\)real_script_name";
# echo "path_info----\(path_info"; # echo "document_root----\)document_root";
fastcgi_index index.php;
# 这里一定要多一个/不然匹配会替换掉
fastcgi_param SCRIPT_FILENAME \(document_root/\)real_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_pass unix:/usr/local/php-7.2.12/var/run/php-cgi.sock;
}

posted on 2018-11-23 13:50  就让往事都随风  阅读(430)  评论(0)    收藏  举报