meixiaofei / powerful-nginx-config

Self use powerful nginx configuration

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

powerful-nginx-config

Self use powerful nginx configuration

nginx try_files的一个坑
原来的配置是酱紫的

location / {
        try_files $uri $uri/ /index.php$is_args$args /app_local.php$is_args$args /app_dev.php$is_args$args;
    }

本以为它会首先找$root/app_local.php$is_args$args这个地方的东东,可没想到的是:它直接当文件读取然后返回了。。

解释:

  这要从 nginx try_files 的工作原理说起。以 try_files $uri $uri/ /app_local.php 为例,当用户请求 http://domain/example 时,这里的 $uri 就是 /exampletry_files 会到硬盘里尝试找这个文件。如果存在名为 $root/example(其中 $root 是 项目目录)的文件,就直接把这个文件的内容发送给用户。显然,目录中没有叫 example 的文件。然后就看 $uri/,增加了一个 /,也就是看有没有名为 $root/example/ 的目录。又找不到,就会 fall backtry_files 的最后一个选项 /app_local.php, 发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到http://domain/app_local.php。   这个请求会被 location ~ .php$ { ... } catch 住,也就是进入 FastCGI 的处理程序。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 PHP应用程序的,因此不受 URI 变化的影响。

  看上面原来的配置,/app_local.php 就不在 fall back 的位置了,也就是说 try_files 在文件系统里找到 app_local.php 之后,就会直接把文件内容(也就是 PHP 源码)返回给用户。这里的坑就是 try_files 的最后一个位置(fall back)是特殊的,它会发出一个内部 “子请求” 而非直接在文件系统里查找这个文件。

About

Self use powerful nginx configuration


Languages

Language:Shell 100.0%