Ubuntu下Nginx部署Django站点:Windows可访问,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

