一个nginx匹配很诡异的问题,原因由权限引起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个nginx匹配很诡异的问题,原因由权限引起相关的知识,希望对你有一定的参考价值。

nginx配置如下:

location ~ \.php$ {
root /opt/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

}

 

按照道理说访问地址如:

xxx.com/statichtml/json.php

应该可以正常访问,可每次访问都是直接下载json.php文件,试了很多次,每次都是如此。

我自己创建一个phpinfo.php,安装目录

xxx.com/statichtml/phpinfo.php却可以正常访问。

难道是权限的问题??

看了下我自己创建phpinfo.php使用root身份创建的。

-rw-r--r-- 1 root  root   17 Sep 20 04:53 phpinfo.php

json.php却是:

-rwxrwxrwx 1 user1 root 4151 Sep 12 09:48 json.php*

创建者是user1.

发现问题不是上面,出在:


location ~* /statichtml/.*\.php$ {

root /opt/nginx/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

}

location ^~ /statichtml/ { 如果开启这个,json2.php就直接下载了。因为这个匹配会覆盖掉.php。不管放在前面还是后面。
root /opt/nginx/html/;


}

上面做法不对,

两个匹配不能区分静态文件和.php文件。

 

我改成:

location ~* /statichtml/.*\.(json|gif|jpg|png|jpeg|html|jpeg|css|js)$ {
   root /opt/nginx/html/;


}

可以解决问题。

后来想的办法:

location ~* /statichtml/.*\.php$ {

root /opt/nginx/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

}
location ~ /statichtml {

root /opt/nginx/html;
}

也可以。

参考文章:

nginx alias的设置

nginx也有像apache的别名功能,格式为:

location ~ /alias {
root /home/www/default;
index index.php;
}

但nginx在处理php脚本时,需要传递给fastcgi才能处理,所以比apache的别名设置多一个,下面我们以phpmyadmin别名设置为例:

location ~ ^/phpmyadmin.+.php$ {
root /home/www/default;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /phpmyadmin {
root /home/www/default;
index index.php;
}
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
参考:
http://www.cnblogs.com/youxin/p/3944568.html

 

以上是关于一个nginx匹配很诡异的问题,原因由权限引起的主要内容,如果未能解决你的问题,请参考以下文章

一次因网络引起的诡异GC问题,DBA该怎么做?

flexible.js字体大小诡异现象解析及解决方案

查找“未知地址上的 SEGV”的原因,由 READ 访问引起

nginx迁移到阿里云后静态文件403错误无法访问的原因都有哪些

Nginx报错403 forbidden (13: Permission denied)的解决办法

由nginx和spring boot中tomcat配置不当引起的问题