Nginx下ThinkPHP5的配置方法詳解

 

url裏public目錄的隱藏php

出於安全的考慮,TP5的入口文件改爲放在public下了,由於這樣的話能防止被惡意用戶訪問到「/thinkphp/」、「/vendor/」等等這些目錄下的文件。因此當你以以前的習慣將網站documentroot配置爲項目根目錄的時候就會須要在url後面加上/public/來訪問。固然可能也會有童鞋把入口文件放回到根目錄下,而後仍是以以前3.x版那樣的形式訪問了。nginx

可是很顯然,這麼作並非那麼的科學。web

假設項目目錄爲「/web/wwwroot/augsky.com」,那麼咱們在網站的nginx配置文件裏面將root配置爲:正則表達式

root /web/wwwroot/augsky.com/public;

可是必定要記得將open_basedir設置爲上一級項目的根目錄下,否則應用會沒有權限調用除public目錄下的其餘文件,網站會報500沒法訪問。(open_basedir的配置默認在php.ini裏面,但若是是多個虛擬機環境的話有可能會在各個網站的user.ini文件裏,這個要根據本身的實際狀況來。)具體配置以下:thinkphp

open_basedir=/web/wwwroot/augsky.com:/tmp/:/proc/

隱藏入口文件index.php:安全

location /
  {
    try_files $uri $uri/ /index.php?s=$uri&$args;
    #若是請求不是文件或目錄,則將uri交給index.php處理,同時保留參數
  }

說一下try_files:網站

try_files
語法: try_files file1 [file2 ... filen] uri
     OR
  try_files file1 [file2 ... filen] =code
默認值: 無
做用域: server location

try_files支持多個參數,每一個參數表明一個文件,系統將按順序檢查這些文件是否存在,存在就直接執行,斜線「/」結尾表明目錄,若都不存在,則會重定向到最後一個參數指向的文件或者返回指定的http狀態碼。url

pathinfo配置.net

在配置文件裏面增長這一段(若是你是lnmp一鍵包用戶,請略過這一段往下翻):unix

location ~ [^/]\.php(/|$) {
  set $path_info "";
  #定義變量 $real_script_name,用於存放真實地址
  set $real_script_name $fastcgi_script_name;
  #若是地址與引號內的正則表達式匹配
  if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
  #將文件地址賦值給變量 $real_script_name
  set $real_script_name $1;
  #將文件地址後的參數賦值給變量 $path_info
  set $path_info $2;
  }
  #配置fastcgi的一些參數
  fastcgi_pass unix:/tmp/php-cgi.sock;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
  fastcgi_param SCRIPT_NAME $real_script_name;
  fastcgi_param PATH_INFO $path_info;
  include  fastcgi_params;
}

上面須要說明的是fastcgi_pass的設置,這個得根據你實際的php版本和安裝目錄來設定。

好,作完這些以後,保存,重啓nginx和php就能生效了。若是你是lnmp一鍵包用戶的話不用上面這樣設置,往下面看:

lnmp一鍵包pathinfo的設置

其實lnmp一鍵包裏面的pathinfo軍哥已經都寫好了,咱們只須要把include enable-php.conf;修改爲include enable-php-pathinfo.conf;而後重啓lnmp就搞定了。

#include enable-php.conf;或者,你直接註釋掉這一行,在下面添加新的一行
include enable-php-pathinfo.conf;

就是這樣簡單。下面順便附上在url裏隱藏模塊的方法

url隱藏默認模塊index

很簡單,在入口文件裏面定義常量BIND_MODULE爲你使用的模塊就行了,以默認的index爲例:

define('BIND_MODULE', 'index');

這樣,在url裏面不會在有模塊名這一級目錄了。要知道,層級少一些的url對SEO是有好處的。

下面是nginx裏面location的匹配規則

Nginx location的匹配規則

  • ~ 波浪線表示執行一個正則匹配,區分大小寫
  • ~* 表示執行一個正則匹配,不區分大小寫
  • ^~ ^~表示普通字符匹配,若是該選項匹配,只匹配該選項,不匹配別的選項,通常用來匹配目錄
  • = 進行普通字符精確匹配
  • @ #"@" 定義一個命名的 location,使用在內部定向時,例如 error_page, try_files

location 匹配優先級

  • = 精確匹配會第一個被處理。若是發現精確匹配,nginx中止搜索其餘匹配。
  • 普通字符匹配,正則表達式規則和長的塊規則將被優先和查詢匹配,也就是說若是該項匹配還需去看有沒有正則表達式匹配和更長的匹配。
  • ^~ 則只匹配該規則,nginx中止搜索其餘匹配,不然nginx會繼續處理其餘location指令。
  • 最後匹配理帶有"~"和"~*"的指令,若是找到相應的匹配,則nginx中止搜索其餘匹配;當沒有正則表達式或者沒有正則表達式被匹配的狀況下,那麼匹配程度最高的逐字匹配指令會被使用。

本文轉載於 http://www.jb51.net/article/120041.htm

相關文章
相關標籤/搜索