树莓派3B(Raspbian Jessie)Nginx+PHP5:.php间链接报Access Denied,.htm链接正常
这问题我之前在类似的Nginx+PHP环境里碰到过,大概率是**页面来源验证(Referer)**相关的限制在搞鬼,不管是PHP脚本自身的逻辑,还是Nginx配置里的规则,咱们一步步排查解决:
1. 先检查activepage.php自身的访问控制代码
很多开发者会在PHP脚本里加Referer验证,防止非法请求。你先打开activepage.php,搜索有没有类似下面的代码:
if (!isset($_SERVER['HTTP_REFERER']) || strpos($_SERVER['HTTP_REFERER'], '.htm') === false) { die("Access Denied"); }
如果有这种只允许.htm页面跳转的逻辑,那从index.php过来的请求自然会被拦截。解决方法很简单:
- 把验证规则改成同时兼容
.php和.htm,比如把strpos($_SERVER['HTTP_REFERER'], '.htm')改成strpos($_SERVER['HTTP_REFERER'], 'index.') - 如果不需要这个验证逻辑,直接注释掉或者删掉这段代码就行
2. 检查Nginx站点配置文件的Referer限制
如果PHP脚本里没找到问题,那大概率是Nginx配置里加了valid_referers规则。打开你的Nginx站点配置文件(一般在/etc/nginx/sites-available/default),找有没有类似下面的配置块:
location ~ \.php$ { valid_referers none blocked server_names /index.htm/; if ($invalid_referer) { return 403; } # 其他PHP配置(比如fastcgi_pass之类的) }
这个规则会只允许来自index.htm的请求访问PHP脚本,从index.php过来的就会返回403(也就是你看到的Access Denied)。修改方法:
- 在
valid_referers里加上/index.php/,改成:valid_referers none blocked server_names /index.htm/ /index.php/; - 如果不需要Referer限制,直接删掉整个
valid_referers和if ($invalid_referer)块就行
修改完配置后,记得重启Nginx生效:sudo service nginx restart
3. 解决XMLHttpRequest调用scandir.php的问题
这个问题其实是上面问题的延伸:当你从index.php打开activepage.php时,页面的Referer是index.php,而activepage.php里的XHR请求的Referer就是当前的activepage.php地址;如果scandir.php也有同样的Referer验证规则,自然也会被拦截。只要解决了前面activepage.php的访问限制,这个XHR的问题也会跟着修复。
快速验证方法
你可以先临时把activepage.php里的Access Denied相关代码注释掉,或者暂时移除Nginx里的valid_referers规则,测试一下是否能正常访问。如果能,就说明确实是Referer验证的问题,再根据你的业务需求调整规则就行。
内容的提问来源于stack exchange,提问作者David Xanatos

