Nginx/RoR4.0.0缓存控制修改失败及页面跳转异常求助
一、强制CSS/JS每次加载都刷新(修改Cache-Control)
要让浏览器每次请求CSS和JS都重新获取,需要同时调整Rails和Nginx的配置——毕竟Nginx的响应头优先级通常会高于Rails返回的内容:
1. Rails层面辅助配置
打开config/environments/production.rb,找到静态资源缓存的配置项,修改为:
config.static_cache_control = "no-cache, no-store, must-revalidate"
这会让Rails返回静态资源时带上严格的缓存控制头,但核心生效还要靠下面的Nginx设置。
2. Nginx核心配置
打开你的Nginx站点配置文件(一般在/etc/nginx/sites-available/目录下),在server块中添加针对CSS/JS的专属规则:
location ~* \.(css|js)$ { # 强制浏览器不缓存,每次都向服务器请求最新资源 add_header Cache-Control "no-cache, no-store, must-revalidate" always; add_header Pragma "no-cache" always; add_header Expires "0" always; # 保留你原有静态资源的基础配置,比如指向Rails的public目录 root /path/to/your/rails/app/public; try_files $uri $uri/ @rails; }
这里的always参数是为了确保即使返回非200状态码(比如404)也会带上这些头,避免意外缓存错误页面。修改完成后重启Nginx:sudo service nginx restart。
二、解决link_to "visits", visits_path重定向到root的问题
这种自己无法复现、只有部分用户遇到的bug确实头疼,给你列几个实用的排查方向:
1. 先检查权限控制逻辑
打开app/controllers/visits_controller.rb,看看有没有权限验证的before_action,比如:
before_action :authenticate_user!, only: [:index] # 或者自定义的权限检查 before_action :check_admin_access def check_admin_access redirect_to root_path unless current_user&.admin? end
如果有这类逻辑,那反馈问题的用户可能没有访问权限(比如未登录、不是管理员),所以被重定向到首页了。你可以用普通用户账号测试验证。
2. 查看生产服务器日志
去Rails生产日志目录(通常是log/production.log),搜索用户访问/visits的记录,日志会直接告诉你重定向的原因,比如:
Started GET "/visits" for 192.168.1.100 at 2024-05-20 10:00:00 +0800 Processing by VisitsController#index as HTML Redirected to http://yourdomain.com/ Filter chain halted as :check_admin_access rendered or redirected Completed 302 Found in 12ms (ActiveRecord: 0.0ms)
这是最直接的排查方式。
3. 验证路由配置是否正确
在服务器上运行rake routes | grep visits,确认visits_path对应的路由是正确的,比如:
visits GET /visits(.:format) visits#index
同时检查config/routes.rb,确保resources :visits(或对应的get路由)没有被其他路由覆盖——比如不要把catch-all路由(get '*path', to: 'home#index')放在visits路由前面,否则会优先匹配catch-all规则。
4. 排查前端缓存或JS干扰
- 让反馈问题的用户右键点击“visits”链接,选择“复制链接地址”,看看实际URL是
/visits还是/。如果是/,说明页面渲染时生成的链接就错了,可能是CDN缓存了旧页面,或者前端JS误修改了链接。 - 让用户用隐私模式访问,或者清除浏览器缓存后再试,排除本地缓存的问题。
- 检查页面的JS代码,有没有类似
$('a[href="/visits"]').attr('href', '/')的逻辑,某些场景下可能会误篡改链接。
5. 检查用户浏览器插件
有些浏览器插件(比如广告拦截器、脚本修改工具)可能会篡改页面链接,让用户暂时禁用所有插件再测试,看看是否恢复正常。
内容的提问来源于stack exchange,提问作者Wordica

