一个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

原文地址:https://www.cnblogs.com/youxin/p/5887352.html