You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派3B(Raspbian Jessie)Nginx+PHP5:.php间链接报Access Denied,.htm链接正常

解决Raspbian Jessie树莓派3B上Nginx+PHP5的跨页面访问权限问题

这问题我之前在类似的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:14:20