公司項目中使用了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那一段,要根據本身項目的目錄結構作調整。