前言
公司项目中使用了thinkphp框架,部署在apache中,很方便,可以参考thinkphp官网的doc:。
而在nginx下,网上没有很具体的文档,都是根据自己项目所配置,拿到别的项目中就行不通了,所以经过本人的研究,摸透了捕鱼方法!
既然使用了thinkphp,那就要对它的URL Mode有所了解。可以参考doc:。
准备工作
首先得做好一切准备了,比如nginx已经启动,项目已经部署完成,但是使用PATHINFO或者REWRITE链接访问页面出现404。
简单陈述下这里所用的项目(假设项目名为NicePrj)的结构:
-
thinkphp框架
-
有多个project,统一放在application目录下
-
URL MODE为REWRITE,即设置URL_MODEL 为2
-
REWRITE链接类似如(用户登录页面):
目录结构也许是这样子的:
/var/www/html/niceprj/
application/
prj1/
prj2/
prj3/
Common/
Conf/
js/
Lang/
Lib/
Runtime/
Tpl/
index.php
thinkphp/
static/
index.php
让我们先用兼容模式看看是否能正常访问,上面用户登录页面,使用兼容模式的链接看上去可以这么写:
?m=user&a=login
或者加上index.php:
index.php?m=user&a=login
在兼容模式下如果能访问页面,那么离成功不远了!
Nginx.conf配置
第一步配置
location / {
root /var/www/html/niceprj;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^/application/prj1/(.*)$ /application/prj1/index.php/$1 last;
rewrite ^/application/prj2/(.*)$ /application/prj2/index.php/$1 last;
rewrite ^/application/prj3/(.*)$ /application/prj3/index.php/$1 last;
break;
}
}
if那一段是重点,我定义了三行rewrite, 我们需要理解的就是第二、第三个参数 。
第二个参数:对哪些地址进行rewrite,同时指定地址中哪部分内容作为URL参数传递。这里在/application/prj1/后面的内容将被认为是URL参数。
符合此定义的链接将被rewrite到第三个参数定义的规则中去。
第三个参数:处理第二个参数过来的URL参数。
比如访问用户登录页面:user/login
user/login将作为URL参数传递到第三个参数,那么rewrite后的地址就是:index.php/user/login
注意,第二个,三个参数可不能一样,如果你写成了:rewrite ^/application/prj1/(.*)$ /application/prj1/$1 last;
那么页面将不停的刷新,刷新,刷新….死循环!此时第一件事就是,立马关掉窗口!
第二步配置
location ~ .+\.php($|/){
set $script $uri;
set $path_info "/";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
root /var/www/html/niceprj;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/niceprj$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
include fastcgi_params;
}
通过上面的配置,fastcgi便支持PATHINFO模式的链接请求了,第一步配置中rewrite后的地址,将会拿到这里来处理,即交给php-cgi来处理。
这样一来就简单多了,您只需要修改网站目录路径了,将/var/www/html/niceprj改成自己的。其他一堆看上去像正则表达式的玩意儿就不用管它了(关于正则表达式,我是外行)
第三步配置
location ~ /\.ht {
deny all;
}
让nginx不要读取.htaccess文件!
总结
经过3步配置,已经完成了该配置的,总的配置看上去应该是这样的:
user nobody;
worker_processes 5;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
gzip on;
server {
listen 8080;
server_name localhost;
charset utf-8;
location / {
root /var/www/html/niceprj;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^/application/prj1/(.*)$ /application/prj1/index.php/$1 last;
rewrite ^/application/prj2/(.*)$ /application/prj2/index.php/$1 last;
rewrite ^/application/prj3/(.*)$ /application/prj3/index.php/$1 last;
break;
}
}
#location ~ \.php$ {
location ~ .+\.php($|/){
set $script $uri;
set $path_info "/";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
root /var/www/html/niceprj;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/niceprj$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
测试
打开浏览器测试下吧,如果有不对的地方(比如404,502,页面死循环样不停刷新(马上关掉页面!)),记得查看日志文件哦,默认为error_log文件。
在日志文件中可以看到,请求了哪个链接,转到了哪个链接。
通常出现问题的话,都是在第一步配置中的rewrite那一段,要根据自己项目的目录结构做调整。