5月 25, 2019 - Linux, php开发, yii2    1 评论

nginx 中的 rewrite 和 try_files

问题描述: 本地yii2, 使用了路由优化prettyUrl,

nginx配置: 

 try_files $uri $uri/ /index.php?$args;

没有用rewrite

当访问

http://www.warpapi.com:83/credit-token/user-auth-key-valid/1121213

使用$_SERVER[‘QUERY_STRING’] = '';

而测试环境使用的配置是

rewrite ^/(.*) /index.php?r=$1 last;

没有使用try_files

当访问: 

http://www.warpapi.com:83/credit-token/user-auth-key-valid/1121213

则$_SERVER[‘QERY_STRING’] = '/credit-token/user-auth-key-valid/1121213'

导致签名时, 两者的解密结果不一致

———————————————————————————–

看YII2文档的时候发现推荐的Nginx配置参数是: 

location / {

# Redirect everything that isn't a real file to index.php

try_files $uri $uri/ /index.php$is_args$args;

}

location ~ \.php$ {

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_pass 127.0.0.1:9000;

#fastcgi_pass unix:/var/run/php5-fpm.sock;

try_files $uri =404;

}

而本地使用的nginx的vhost配置是

rewrite ^/(.*)$ /index.php/$1 last;

rewrite是类似Apache的配置

这里的配置也比较的容易理解,但是为啥官方的推荐要推荐try_files呢

 

最后找到了一个答案:Nginx一般都是配合fpm来使用的,

如果使用rewrite的时候会把所有的文件都重定向然后发送给php-fpm包括了静态文件,所以现在已经不推荐这样的配置了.

———————————————————————————–

原生的url样式:

http://www.xxx.com/index.php?name=will&age=20

伪静态的样式: 

http://www.xxab.com/hello/world.html

http://www.xxx.com/content/23223.html

伪静态的优点:

(1), url地址比较友好,看着爽,更有说服务力

(2), 如果是一个内容站,有利于seo优化

(3), 有效的防止sql注入,让别人不知道你真实的url地址

缺点:

与原生的url比较在性能上,不如原生的url,简单的说伪静态就是在服务器上又进行了一层url解析,消耗服务器资源。但总体利大于弊的.

rewrite 语法格式:

rewrite   [regex]                  [replacement]      [flag];

               url正则表达式        替换真实url          标记(last,break)

如: rewrite ^/(.*) /index.php?r=$1 last;

try_files $uri $uri/ /index.php?$args;

$uri  这个是nginx的一个变量,存放着用户访问的地址,

比如:http://www.xxx.com/index.html, 那么$uri就是 /index.html

 

$uri/ 代表访问的是一个目录,比如:http://www.xxx.com/hello/test/    ,那么$uri/就是 /hello/test/

 

完整的解释就是:try_files 去尝试到网站目录读取用户访问的文件,如果第一个变量存在,就直接返回;

不存在继续读取第二个变量,如果存在,直接返回;不存在直接跳转到第三个参数上。

还要try_files干什么呀,直接使用rewrite不就可以了吗?

答:不可以,因为rewrite这个指令把所有请求过来的url地址,都与htaccess文件中的正则地址进行一次匹配,这样的话,静态的url地址也进行了一次匹配,比如http://xxxx.com/aa.png,这个地址是不需要重写的,但是rewrite也进行了一次匹配,这就浪费服务器资源,影响执行效率。而我们真正需要匹配的,其实都是一些动态url地址,如果我说这么多,你还不明白的话,可以打印日志查看.

—————————————————————————

评论被关闭。