nginx中try_files参数易被忽略的知识点

先创建测试目录与文件

mkdir -p /php/aaa/bbb
vim /php/aaa/index.html

<h1>small try</h1>

配置nginx server

 server {
        listen       80;
        server_name  www.ready.org;
 location / {
            root  /php;
            try_files $uri $uri/ /index.php;
            index  index.html index.htm;
        }
        location ~ .*\.(php|php5)?$ {
            root   /php;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
        }
                }

如上面的简单例子,开启了try_files参数时,浏览器输入www.ready.org/aaa 或者 www.ready.org/aaa/ 都会显示small try:

若浏览器输入www.ready.org/aaa/bbb 则会出现403 Forbidden

若浏览器输入www.ready.org/ccc 时,则会跳转至phpinfo页面(默认在根下创建了名为index.php的phpinfo文件)

由上述可以看出try_files参数可以实现自动检测网站根下是否存在用户在浏览器输入的名为URI文件和名为URI的目录,若存在则会跳转至用户请求的URI,并按所匹配的location完成后续步骤,若不存在则会跳转至最后一个参数,这以上例子中最后一个参数是根下的index.php(phpinfo),所以当找不到ccc目录和文件时,便跳转至根下的index.php

但会有一个比较特殊的情况,先看下面的例子:

server {
        listen       80;
        server_name  www.ready.org;
 location / {
            root  /php;
            **try_files $uri $uri/ =502**
            index  index.html index.htm;
        }
        location ~ .*\.(php|php5)?$ {
            root   /php;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
        }
                }

粗体部分是修改后的参数,简单的说就是当nginx找不到用户请求的URI文件和目录时,会直接跳转到502错误页面,有了之前的例子这个就很好理解。但如果改成以下情况:

 server {
        listen       80;
        server_name  www.ready.org;
 location / {
            root  /php;
            **try_files $uri $uri/ /index.php =502;**
            index  index.html index.htm;
        }
        location ~ .*\.(php|php5)?$ {
            root   /php;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
        }
                }

当用户请求为www.ready.org/ccc 时会出现什么情况呢?

测试后发现会弹出php文件的下载对话框(因为浏览器不同,有些浏览器会直接显示php文件的源码),不管怎么这都说明php文件没有被解析直接返回给了用户,为什么呢?原来是因为try_files参数会一直判断后面的文件或目录是否存在,若不存在会一直向后检查,直到倒数第二个参数被检查完,若都不存在,即解析并返回最后一个参数,中途的检查若存在,则直接返回给用户而不做解析,所以上面的例子最后才会返回php源码,nginx会自己内部直接返回,而不会交由php-fpm解析再返回。

原文地址:http://blog.51cto.com/13322786/2161576

时间: 2024-08-03 16:27:27

nginx中try_files参数易被忽略的知识点的相关文章

Nginx中FastCGI参数优化

FastCGI: FastCGI是从CGI发展改进而来的.传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器.这在处理高并发访问时,几乎是不可用的.另外传统的CGI接口方式安全性也很差,现在已经很少被使用了. FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程.当HTTP服务器每次遇到动态程序时,可以将其直接交付给Fast

C++:类中两个易被忽略的默认函数

C++的自定义类中有六个默认的函数,即如果用户没有显式定义这些函数时,C++编译器会类中生成这些函数的默认形式.除了大家所熟知的构造函数.拷贝构造函数.赋值函数和析构函数外,C++为自定义类 还提供了两个容易被人忽视的默认函数--取地址函数和对常对象的取地址函数. 一.取地址函数 在C++中可以通过取地址运算符&求得变量的地址,如: 1 int a=10; 2 cout<<"变量a的地址为:"<<&a<<endl; 那么对于自定义类的

nginx中worker_cpu_affinity参数及其CPU相关知识

worker_cpu_affinity Syntax: worker_cpu_affinity cpumask [cpumask...] Default: none Linux only. With this option you can bind the worker process to a CPU, it calls sched_setaffinity().  For example  worker_processes     2;  worker_cpu_affinity 01 10;

NGINX 中把url中的内容当初参数处理

作用:把url为:127.0.0.1/index.php/a/b/c 这样处理 把 post参数: /a/b/c到127.0.0.1/index.php nginx 配置如下: server {     listen  80;     server_name     127.0.0.1;     root /home/shaddock/Applications/htdocs;     index index.html index.htm index.php index.js;     acces

nginx中fastcgi_params配置参数

Nginx 的 fastcgi 模块提供了 fastcgi_param 指令来主要处理这些映射关系,下面 Ubuntu 下 Nginx 的一个配置文件,其主要完成的工作是将 Nginx 中的变量翻译成 PHP 中能够理解的变量. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径,也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配

Nginx 中 HTTP模块初始化

概述 在前面的文章< Nginx 配置解析>简单讲解了通用模块的配置项解析,并且大概讲解了HTTP 模块的配置项解析过程,本文更具体的分析 HTTP 模块的初始化过程.HTTP 模块初始化过程主要有:上下文结构初始化.配置项解析.配置项合并.server 相关端口设置. HTTP 模块接口 ngx_http_module_t 结构体 在 Nginx 中,结构体 ngx_module_t 是 Nginx 模块最基本的接口.对于每一种不同类型的模块,都有一个具体的结构体来描述这一类模块的通用接口.

Nginx 中处理 HTTP 请求

概述 在 Nginx 的初始化启动过程中,worker 工作进程会调用事件模块的ngx_event_process_init 方法为每个监听套接字ngx_listening_t 分配一个 ngx_connection_t 连接,并设置该连接上读事件的回调方法 handler 为 ngx_event_accept,同时将读事件挂载到epoll 事件机制中等待监听套接字连接上的可读事件发生,到此,Nginx 就可以接收并处理来自客户端的请求.当监听套接字连接上的可读事件发生时,即该连接上有来自客户端

nginx中的正则表达式

1.if指令 所有的nginx内置变量都可以通过if指令和正则表达式来进行匹配,并且根据匹配结果进行一些操作,如下: if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) { set $id $1; } 使用符号~*和~模式匹配的正则表达式: ~为区分大小写的匹配. ~*不区分大小写的匹配(匹配firefox的正则同时匹配Fir

Last-Modified和ETag以及Apache和Nginx中的配置

1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样: Last-Modified: Fri, 12 May 2006 18:53:33 GMT 客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过: If-Modified-Si