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

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/youxin/p/5887352.html
Copyright © 2020-2023  润新知