版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33222871/article/details/81117582
如果laravel项目路径在/home/project/laravel目录下
则nginx配置如下
location ~ \.php$ {
root /home/laravel/public/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
这样配置之后,输入127.0.0.1/即可访问laravel项目,
但是这样不符合我的要求,,假如我在/home/laravel2/下面又建了一个laravel项目,那么我必须去修改nginx配置才能访问新项目,而且旧项目就不能访问了。
我想要的效果是类似如tomcat的webapps功能,只要我在这个路径下新建项目,那么我什么都不用做就可以访问。
首先要搞明白的是——nginx如何处理的php请求
其次——laravel是如何找到对应路由的。
- nginx代理php实际上也是一种反向代理,nginx将请求交给php-fpm;php-fpm处理了请求之后再交给nginx
- 与一般的nginx反代不同的是,php-fpm能够获取地址栏上的内容,而不是nginx反代之后的地址;因此laravel实际上也是根据地址栏上的uri来找对应的路由
- 查看php的报错信息发现,laravel实际上有几个比较重要的变量,分别是DOCUMENT_ROOT,DOCUMENT_URI,REQUEST_URI,SCRIPT_NAME;这类变量有很多,大概关注这几个就行了。(php可以通过$_SERVER['']来查看)
- DOCUMENT_ROOT是项目路径,一般指向public目录,DOCUMENT_URI不是很清楚,就laravel框架写成"/index.php";SCRIPT_NAME相同;最重要的是REQUEST_URI,这里就是地址栏上的uri,所以只要修改这里的值就可以实现功能了;
- REQUEST_URI是怎么来的呢?看nginx配置项有一个fastcgi_param,这个指令的作用是给php-fpm传递参数
- 我现在要用127.0.0.1/php/s/public/133访问/home/larvel/s/ 下的laravel项目的133路由,因此location匹配规则如下 /php/([^/]+)/public/(.+),第一个括号内的值代表larvavel所在目录,相当于webapps下的第一级目录名称,public为固定,也可以不要,第二个括号内为uri匹配,是我真正要交给laravel解析的uri,在此时应该就是133
故,完整配置如下
location ~ /([^/]+)/(.+)/index.php$ {
root /home/larvels/$1/public/;
include fastcgi_params;
fastcgi_param DOCUMENT_URI "/index.php";
fastcgi_param REQUEST_URI /$2;
fastcgi_param SCRIPT_NAME "/index.php";
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ /php/([^/]+)/public/(.+) {
try_files $uri $uri/ /$1/$2/index.php?$query_string;
}