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 ;
server_name quick.qun.me; #外网能够访问的域名
location / {
alias /home/php_project; #注意和root的区别 , 还要注意: alias和转发PHP配置在一个location块中的时候, 不会替换路径
index index.php index.html index.htm;
fastcgi_pass 127.0.0.1:;
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. (根据我的判断, 虽然access denied也是403, 但因为他是PHP处理的, 所以会显示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 配置的路径没问题) 去看 了一下, 提示 "Access to the script '/home/php_project/phpinfo' has been denied", 如果是路径的问题, 那么应该是报文件或路径不存在之类的, 就说明还是和PHP有关的, 按照alias 的规则, 应该是把/phpinfo 替换掉了才对. 但是这里并没有替换掉, 我曾一度怀疑是alias 规则没搞明白, 后来经过测试, 也想明白了, 之所以alias没有起作用, 是因为转发给了PHP 处理, 如果注释掉fastcgi那几个配置, 就会发现, alias替换掉了/phpinfo, 而交给PHP处理, alias是不会替换的.
- 解决办法: 修改location / 为 location /phpinfo , 然后还是不行, error.log报错Unable to open primary script: /home/php_project/phpinfo/index.php (No such file or directory)" , 再创建一个phpinfo目录, 在目录下创建index.php 文件, 访问/phpinfo 还是access denied, 但是访问/phpinfo/ 或者 /phpinfo/index.php 就OK了. (访问的时候, 路径phpinfo后面记得加一个/ ,不然PHP程序会把phpinfo当做文件来处理)
- 不过这里有一点需要注意: (参考alias替换URI规则) 注意 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了.
- 解决方法: 修改location / 为 location /phpinfo , 然后还是不行, error.log报错Unable to open primary script: /home/php_project/phpinfo/index.php (No such file or directory)" , 再创建一个phpinfo目录, 在目录下创建index.php 文件, 访问/phpinfo 还是access denied, 但是访问/phpinfo/ 或者 /phpinfo/index.php 就OK了
- 总结: (1)access denied 基本上就是请求的URI转发给PHP处理, 但是文件后缀不是.php 或者需要在security.limit_extensions 里添加后缀.
(2) 还有在转发的时候, 如果用到了alias, 需要注意, alias 替换的 URI 不要弄混, 一定是替换的alias所在的location . 而不是proxy_pass 所在的location块.
(3) alias 所在的location块中遇到配置fastcgi的时候, 就不会替换路径(root不知道, 至少alias是这样的), 只有在nginx本身处理的时候, alias才会替换掉location匹配的URI, 如果交给PHP处理, 则不会替换location匹配到的URI, 而是将完整的路径直接给PHP处理.
(4) PHP处理的时候, 会判断路径最后面有没有/ , 有/ PHP认为是目录, 会在这个目录下找PHP文件, 如果是/phpinfo 这种最后没有/, PHP就会把phpinfo当成是文件, 就会出现access denied, PHP不认识phpinfo文件, 提示你修改security.limit_extensions. (所以上面访问/phpinfo还是access denied)
access denied的更多相关文章
- MySql Access denied for user 'root'@'localhost' (using password:YES) 解决方案
关于昨天下午说的MySQL服务无法启动的问题,解决之后没有进入数据库,就直接关闭了电脑. 今早打开电脑,开始-运行 输入"mysql -uroot -pmyadmin"后出现以下错 ...
- phpmyadmin #1045 - Access denied for user 'root'@'localhost' (using password: NO)
phpmyadmin访问遇到1045问题 #1045 - Access denied for user 'root'@'localhost' (using password: NO) 解决办法 找到p ...
- Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes
Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes http://blog.csdn.n ...
- Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'
这几天学习Laravel框架遇到了数据库方面的问题. PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denie ...
- Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
案例环境: 操作系统 :Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64 bit 数据库版本 : Mysql 5.6.19 64 bit ...
- MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的真正原因
在博客Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: N ...
- mac 安装mysql + 修改root用户密码 + 及报Access denied for user 'root'@'localhost' (using password:YES)解决办法
1.下载MySQL 到mysql的官网http://dev.mysql.com/downloads/mysql/然后在页面中会看到“MySQL Community Server”下方有一个“downl ...
- MySql access denied for user错误
MySql access denied for user错误 | 浏览:2812 | 更新:2014-11-27 11:16 MySql access denied for user错误 方法/步骤 ...
- 升级到macOS 10.12 mysqlb报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
系统升级到macOS 10.12后启动mysql后,在终端输入mysql 报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' ...
- mysql 链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES))
mysql链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)) 修改: # ...
随机推荐
- Pots(POJ-3414)【BFS】
题意:有两个有着固定容量的茶壶,初始时都为空,要求用FILL,POUR,DROP三种操作来准确地得到C值,输出最少次数及操作方案. 思路:比赛的时候真是脑子不好使,根本没想到是搜索,看了别人的题解用搜 ...
- Web Server 分布式服务: Nginx负载均衡
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用.其 ...
- linux下mysql部署
mysql 1.拓扑结构 mysql集群有如下三层: 应用程序层:负责与mysql服务器通信的各种应用程序. Mysql服务器层:处理SQL命令,并与NDB存储引擎通信和Mysql服务器. NDB集群 ...
- Spring Boot:上传文件大小超限制如何捕获 MaxUploadSizeExceededException 异常
Spring Boot 默认上传文件大小限制是 1MB,默认单次请求大小是 10MB,超出大小会跑出 MaxUploadSizeExceededException 异常 spring.servlet. ...
- Django模型(model)系统
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- skywalking-agent 与docker组合使用
docker部署 公司有使用docker部署的微服务 可以直接使用 仓库/java:8-jdk-alpine-asla-shanghai-1-skyagent-2作为基础镜像 这个镜像包是java8 ...
- Invalid default value for 'time'
原因:安装的MySQL5.7版本之后,date, datetime类型设置默认值"0000-00-00",出现异常:Invalid default value for 'time' ...
- 图数据库-Neo4j-初探
图数据库-Neo4j-初探 2018-08-17 本次初探主要学习如何安装Neo4j,以及Cypher的基本语法. 1. 安装Neo4j Desktop版本 neo4j-desktop Server版 ...
- .net core 根据数据库生成实体类
微软最近几年在跨平台上不断发力,很多.net程序员也摩拳擦掌,对微软寄以厚望.就在最近,微软还推出了asp .net core2.0预览版. 通过对.net core的简单尝试,我发现以往我们开发MV ...
- 三种定位+堆叠+li小黑点变图片
定位: 定位分为三种: position:static(默认值) relation(相对定位):进行较小偏移,不会脱离文档流,原位置保留 absolute(绝对定位):脱离文档流,不占据页面空间,变成 ...