llcong 发表于 2017-12-23 12:34:34

nginx 隐藏 index.php 和 开启 pathinfo 模式的配置

  nginx 通过 location 的规则匹配将 php 转发给 php-fpm 处理后获取结果然后返回给客户端,转发模式可以通过 unix sock 或 tcp socket 方式。百度了好多文章我是没遇到一个能完整的而且正确的把 nginx 和 php 结合的配置讲述的较为正确的,这里总结了下最基本的 nginx + php 的模式配置,以及隐藏 index.php 和 开启 pathinfo 模式的方法。
  个人觉得是可以复制粘贴配置你的生产环境的,总结了很多好的博文的要点,比如隐藏 index.php 的 location 规则用的是 try_files 而不是烂大街的 if (! -e $uri) {},http 服务器级配置文件 和 虚拟主机配置文件也很好的分割开了,方便维护。
  nginx 配置分两大层,基础的全局 http 配置 和 与主机相对应的 server 配置。

http 配置
  nginx.conf
  

# nginx main configure  

  
userwww www;
  

  
worker_processes auto;
  

  
error_log/var/log/error.logcrit;
  

  
pid      /var/nginx.pid;
  

  
#Specifies the value for maximum file descriptors that can be opened by this process.
  
worker_rlimit_nofile 2048;
  

  
events
  
{
  
use epoll;
  
worker_connections 2048;
  
multi_accept on;
  
}
  

  
http
  
{
  
include       mime.types;
  
default_typeapplication/octet-stream;
  

  
server_names_hash_bucket_size 128;
  
client_header_buffer_size 32k;
  
large_client_header_buffers 4 32k;
  
client_max_body_size 50m;
  

  
sendfile   on;
  
tcp_nopush on;
  

  
keepalive_timeout 60;
  

  
tcp_nodelay on;
  

  
fastcgi_connect_timeout 300;
  
fastcgi_send_timeout 300;
  
fastcgi_read_timeout 300;
  
fastcgi_buffer_size 64k;
  
fastcgi_buffers 4 64k;
  
fastcgi_busy_buffers_size 128k;
  
fastcgi_temp_file_write_size 256k;
  

  
gzip on;
  
gzip_min_length1k;
  
gzip_buffers   4 16k;
  
gzip_http_version 1.1;
  
gzip_comp_level 2;
  
gzip_types   text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
  
gzip_vary on;
  
gzip_proxied   expired no-cache no-store private auth;
  
gzip_disable   "MSIE \.";
  

  
#limit_conn_zone $binary_remote_addr zone=perip:10m;
  
##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
  

  
server_tokens off;
  
access_log off;
  

  
# http 配置
  
include vhost/*.conf;
  
}
  

  nginxhttp 的主配置文件,这里面包含了用户组,日志,处理类型,压缩传输,并发数等参数配置。我们并没有在这里配置 server,而是将所有的 server 放置到 vhost 文件中,清晰的管理我们的 server 虚拟主机配置。我们可以将不同 server 服务器单独配置为 conf 文件。

server 配置
  比如我们配置一虚拟主机 default
  vhost/default.conf
  这里面参数配置包括:隐藏 index.php,开启php处理或开启php pathinfo模式,单独处理静态资源
  注意:
  如果你想开启 pathinfo 模式只需要将 enable-php.conf 改为 enable-php-pathinfo.conf 即可,二者选其1
  

server  
{
  
listen
80;  

#listen [::]:80;  
server_name www.default.com;
  
index index.html index.htm index.php;
  
root/var/www/default;
  

  
#error_page   404   /404.html;
  

  
#hide index.php
  
location / {
  
# yii2 框架的 /site/index?name=sallency&age=25 模式的 rewrite 方法
  
try_files $uri $uri/ /index.php$is_args$args;
  
# tp 框架的 /site/index/name/sallency/age/25 模式的 rewrite 方法
  
try_files $uri $uri/ /index.php/$uri;
  
# 虽然 if 不规范但 rewrite 还是很方便的 可以兼容 yii2 和 tp 的 pathinfo 模式
  
if (!-e $request_filename){
  
rewrite ^/(.*)$ /index.php/$1 last;
  
break;
  
}
  
}
  

  
#handler php request
  
include enable-php.conf;
  

  
#php with pathinfo
  
#include enable-php-pathinfo.conf;
  

  
#handler static resource
  
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  
{
  
expires      30d;
  
}
  

  
location ~ .*\.(js|css)?$
  
{
  
expires      12h;
  
}
  

  
#forbidden access . type
  
location ~ /\.
  
{
  
deny all;
  
}
  

  
access_log/var/log/nginx/default_access.log
  
}
  


配置 php
  enable-php.conf
  开启此配置便可以让 nginx 处理 php 文件,需要注意的是fastcig_pass 的模式有两种:
  unix socket:不走网卡 效率高但不稳定
  tcp socket:127.0.0.1:9000 相比 unix socket 会慢一点点,但稳定性高出很多
  此处的模式和配置选择应与 php-fpm.conf 中的 listen 参数保持一致:
  listen = /tmp/php-cgi.sock
  listen = 127.0.0.1:9000
  

location ~ [^/]\.php(/|$)  
{
  
try_files
$uri =404;  

  

#listen unix socket  
#fastcgi_passunix:/tmp/php-cgi.sock;
  
#listen tcp socket
  
fastcgi_pass127.0.0.1:9000;
  

  
fastcgi_index index.php;
  
include fastcgi.conf;
  
}
  


配置 pathinfo 模式
  enable-php-pathinfo.conf
  此配置文件为 enable-php.conf 的增强版-- 开启 pathinfo 模式,流行的 php 框架都支持此模式
  

location ~ [^/]\.php(/|$)  
{
  

#listen unix socket  
#fastcgi_passunix:/tmp/php-cgi.sock;
  
#listen tcp socket
  
fastcgi_pass127.0.0.1:9000;
  

  
fastcgi_index index.php;
  
include fastcgi.conf;
  

  
#pathinfo
  
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  
set $path_info $fastcgi_path_info;
  
fastcgi_param PATH_INFO $path_info;
  
try_files $fastcgi_script_name =404;
  
}
  

  fastcgi.conf
  这个配置文件其实是 nginx 自带的,我贴一下
  

fastcgi_paramSCRIPT_FILENAME    $document_root$fastcgi_script_name;  
fastcgi_paramQUERY_STRING      
$query_string;  
fastcgi_paramREQUEST_METHOD   
$request_method;  
fastcgi_paramCONTENT_TYPE      
$content_type;  
fastcgi_paramCONTENT_LENGTH   
$content_length;  

  
fastcgi_paramSCRIPT_NAME      
$fastcgi_script_name;  
fastcgi_paramREQUEST_URI      
$request_uri;  
fastcgi_paramDOCUMENT_URI      
$document_uri;  
fastcgi_paramDOCUMENT_ROOT      
$document_root;  
fastcgi_paramSERVER_PROTOCOL   
$server_protocol;  
fastcgi_paramREQUEST_SCHEME   
$scheme;  
fastcgi_paramHTTPS            
$https if_not_empty;  

  
fastcgi_paramGATEWAY_INTERFACECGI
/1.1;  
fastcgi_paramSERVER_SOFTWARE    nginx
/$nginx_version;  

  
fastcgi_paramREMOTE_ADDR      
$remote_addr;  
fastcgi_paramREMOTE_PORT      
$remote_port;  
fastcgi_paramSERVER_ADDR      
$server_addr;  
fastcgi_paramSERVER_PORT      
$server_port;  
fastcgi_paramSERVER_NAME      
$server_name;  

  

# PHP only, required if PHP was built with --enable-force-cgi-redirect  
fastcgi_paramREDIRECT_STATUS    200;
  

  配置完成,注意因为所有的配置文件都是由 nginx.conf 这个主配置文件作为入口进行加载的,所以活动目录始终是在 nginx.conf 所在的目录,所以配置文件中的 include 的当前路径是 nginx.conf 所在的目录,配置完成后重启 nginx service 的同时记得重启 php-fpm 服务
页: [1]
查看完整版本: nginx 隐藏 index.php 和 开启 pathinfo 模式的配置