公司项目中使用了thinkphp框架,部署在apache中,很方便,能够参考thinkphp官网的doc:Apache URL重写。 php
而在nginx下,网上没有很具体的文档,都是根据本身项目所配置,拿到别的项目中就行不通了,因此通过本人的研究,摸透了捕鱼方法! html
既然使用了thinkphp,那就要对它的URL Mode有所了解。能够参考doc:URL 模式。 node
首先得作好一切准备了,好比nginx已经启动,项目已经部署完成,可是使用PATHINFO或者REWRITE连接访问页面出现404。 nginx
简单陈述下这里所用的项目(假设项目名为NicePrj)的结构: 正则表达式
目录结构也许是这样子的: thinkphp
/var/www/html/niceprj/ application/ prj1/ prj2/ prj3/ Common/ Conf/ js/ Lang/ Lib/ Runtime/ Tpl/ index.php thinkphp/ static/ index.php
让咱们先用兼容模式看看是否能正常访问,上面用户登陆页面,使用兼容模式的连接看上去能够这么写: apache
http://www.....com/appliction/prj3/?m=user&a=login 浏览器
或者加上index.php: php框架
http://www.....com/appliction/prj3/index.php?m=user&a=login app
在兼容模式下若是能访问页面,那么离成功不远了!
第一步配置
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, 咱们须要理解的就是第2、第三个参数 。
第二个参数:对哪些地址进行rewrite,同时指定地址中哪部份内容做为URL参数传递。这里在/application/prj1/后面的内容将被认为是URL参数。
符合此定义的连接将被rewrite到第三个参数定义的规则中去。
第三个参数:处理第二个参数过来的URL参数。
好比访问用户登陆页面:http://www.....com/appliction/prj3/user/login
user/login将做为URL参数传递到第三个参数,那么rewrite后的地址就是:http://www.....com/appliction/prj3/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那一段,要根据本身项目的目录结构作调整。