access denied

  • 背景: 想要使用nginx转发 实现一个输出PHPinfo的页面,比如: 访问  aaa.com/phpinfo  浏览器显示phpinfo的信息,因为有的时候需要查看phpinfo,所以想单独配置一个能直接访问phpinfo的页面.  因为是PHP文件,所以肯定需要转发给PHP处理,  贴出配置
    location /phpinfo {
           proxy_pass  http://127.0.0.1:8867;
    }
    # nginx 转发给8866 端口,然后去配置一下8866 端口的服务
    server {
        lieten 8867;
        server_name quick.qun.me;   #外网能够访问的域名
        location / {
            alias  /home/php_project; #注意和root的区别
            index  index.php index.html index.htm;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_index index.php;
            include fastcgi_params;     
        }
    }
    当我配置好了以后,访问quick.qun.me/phpinfo 的时候,页面显示  access denied.   查看nginx error.log 出现*408132 FastCGI sent in stderr: "Access to the script ‘/home/php_project/phpinfo‘ has been denied (see security.limit_extensions)" while reading response header from upstream,client: 127.0.0.1,server: quick.qun.me,request: "GET /phpinfo HTTP/1.0",upstream: "fastcgi://127.0.0.1:9000",host: "127.0.0.1:8867"
  • 排查:  以为是nginx配置没有开启 autoindex  on  ;  但是一想不对,如果是因为这个,肯定是403 forbidden,不会显示access  denied. 
    • 他有一个细节就是  security.limit_extensions, (网上说在php-fpm.conf文件里,我没找到,这个参数我是在/etc/php/7.0/fpm/pool.d/www.conf 文件里找到的)百度,  需要在这个后面加上 .php .php5 ..... 之类的,我试了一下去掉注释,重启php-fpm,并没有起作用. 还是access denied. (补充: 从5.3.9开始,php官方加入了一个配置"security.limit_extensions",默认状态下只允许执行扩展名为".php"的文件,造成了其他类型的文件不支持的问题,设置PHP允许的文件后缀名)  . 而且之前这个security.limit_extensions就是被注释掉的,项目也能访问啊,  所以猜测肯定不是这个的原因.(其实后来想一想也是这个的原因,后面提到)
    • 但是nginx 的error.log 为什么偏偏提示这个信息呢? 隔了一天,继续研究一下,再看nginx/error.log,突然想到路径的问题,  (ps: 之前没有考虑路径是因为自信觉得alias 配置的路径没问题)  去看 了一下,发现没有创建过phpinfo目录,index.php文件是在/home/php_project目录下,所以问题的答案渐渐浮出水面的赶脚!!! 
    • 不过又有了一个新问题:  alias 配置的路径是 去掉了/phpinfo的啊? 为什么没有去掉呢? (参考alias替换URI规则) 后来发现其实不是alias 出现问题,而是我搞混了,注意  alias 所在location 并不是/phpinfo,转发之前是/phpinfo,alias实际替换的是 /,因为alias所在的location是 /,我误认为是alias 所在的location是 /phpinfo了,所以没有发现问题. 所以问题出在了location的配置上. 加一个phpinfo就OK了.
    • 继续说:   如果location / {} 里没有配置fastcgi,那么应该就会报404或者403或者下载(没有测试,只是猜测)  但是现在配置了fastcgi,所以说 就会把这个请求交给PHP处理,而PHP发现phpinfo不是  .php 后缀,所以返回access denied. (那么现在也就知道了access denied 就是PHP处理程序返回的信息,和nginx无关) . 到这里,处理方法有两种,一种是修改security.limit_extensions,如果phpinfo是文件的话,可以修改此参数,但现在phpinfo是目录,所以不修改此参数,而是从alias入手. 修改location / 为 location /phpinfo   就OK了
  • 解决方法: 修改alias 所在的location,将location /  改为  location /phpinfo   ,这样alias 就是正确替换了/phpinfo,否则替换的仅仅是 /

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...