Nginx中配置thinkphp的URL重寫

前言

公司項目中使用了thinkphp框架,部署在apache中,很方便,能夠參考thinkphp官網的doc:Apache URL重寫php

而在nginx下,網上沒有很具體的文檔,都是根據本身項目所配置,拿到別的項目中就行不通了,因此通過本人的研究,摸透了捕魚方法! html

既然使用了thinkphp,那就要對它的URL Mode有所瞭解。能夠參考doc:URL 模式node

準備工做

首先得作好一切準備了,好比nginx已經啓動,項目已經部署完成,可是使用PATHINFO或者REWRITE連接訪問頁面出現404。 nginx

簡單陳述下這裏所用的項目(假設項目名爲NicePrj)的結構: 正則表達式

  1. thinkphp框架
  2. 有多個project,統一放在application目錄下
  3. URL MODE爲REWRITE,即設置URL_MODEL 爲2
  4. REWRITE連接相似如(用戶登陸頁面):http://www.....com/appliction/prj3/user/login

目錄結構也許是這樣子的: 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

在兼容模式下若是能訪問頁面,那麼離成功不遠了!

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, 咱們須要理解的就是第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那一段,要根據本身項目的目錄結構作調整。

相關文章
相關標籤/搜索