一个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匹配很诡异的问题,原因由权限引起的主要内容,如果未能解决你的问题,请参考以下文章
查找“未知地址上的 SEGV”的原因,由 READ 访问引起
nginx迁移到阿里云后静态文件403错误无法访问的原因都有哪些