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

Ubuntu下Nginx部署Django站点:Windows可访问,Mac/iPhone报403 Forbidden

解决Ubuntu Nginx部署Django站点Mac/iPhone访问403 Forbidden问题

嘿,碰到这种跨设备的访问差异问题确实挺闹心的,我帮你梳理几个最可能的原因和对应的排查步骤:

1. 检查Nginx的User-Agent过滤规则

有时候Nginx配置里会不小心加了针对特定浏览器/设备的UA拦截规则,Windows的UA能顺利通过,但Mac/iPhone的请求被误挡了。你可以打开站点的Nginx配置文件排查:

sudo nano /etc/nginx/sites-available/your-django-site.conf

找有没有类似这样的代码块:

if ($http_user_agent ~* "(iPhone|Macintosh)") {
    return 403;
}

如果有的话,直接注释掉或者删掉,然后重启Nginx生效:

sudo systemctl restart nginx

再用Mac/iPhone测试访问。

2. 排查Django的CSRF验证问题

Django默认开启CSRF防护,POST请求必须携带有效的CSRF Token才能通过。Windows上可能之前访问过站点,浏览器缓存了相关Cookie,能自动带上Token;但Mac/iPhone如果是首次访问或者用了无痕模式,可能没正确获取到Token,导致返回403。

  • 先测试GET请求(比如直接访问站点首页)能不能正常访问,如果GET没问题,那大概率是CSRF的锅。
  • 确保你的Django模板里在表单中加入了{% csrf_token %}标签;
  • 如果是API接口,需要在Django的settings.py里配置信任的来源:
CSRF_TRUSTED_ORIGINS = ['your-domain.com']
  • 也可以临时注释掉settings.py里的'django.middleware.csrf.CsrfViewMiddleware'来测试(注意:生产环境别这么干,测试完一定要加回去)。

3. 验证Nginx的文件权限与目录配置

虽然Windows能访问,但Mac/iPhone的请求可能触发了Nginx对静态文件或目录的权限检查。你可以:

  • 确保Nginx运行用户(通常是www-data)对Django的静态文件目录有读取权限:
sudo chown -R www-data:www-data /path/to/your/django/static
sudo chmod -R 755 /path/to/your/django/static
  • 检查Nginx配置里有没有开启autoindex on;,如果开启了目录索引,某些目录访问可能被限制,改成autoindex off;后重启Nginx试试。

4. 检查服务器安全工具/防火墙规则

如果服务器上装了mod_security这类Web应用防火墙,可能它的规则误判了Mac/iPhone的请求特征,拦截了POST请求。你可以暂时关闭mod_security测试:

sudo a2dismod mod_security
sudo systemctl restart nginx

另外,检查服务器的防火墙(比如ufw)有没有针对Mac/iPhone所在IP段的限制,确保80/443端口是对外开放的。

从你提供的访问日志来看,那条Windows Opera浏览器的POST请求也返回了403,说明你的站点POST接口本身就需要CSRF Token,不同设备的Cookie状态差异导致了访问结果不同。先从CSRF和UA过滤这两点入手排查,应该能快速定位问题。

内容的提问来源于stack exchange,提问作者abdhesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:58:54