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

Nginx动态路由调用问题:/amp/blogs/1无法访问求助

解决Nginx中/amp/blogs可访问但/amp/blogs/1无法访问的问题

我仔细看了你的Nginx配置,问题主要出在location /amp/blogs块里的指令冲突和路径处理逻辑上,咱们一步步来修正:

核心问题分析

  1. 指令互斥导致请求混乱
    你在同一个location块里同时写了proxy_pass和passenger_enabled——这两个指令是互斥的,Nginx不知道该把请求交给反向代理还是Passenger处理,对于带参数的路径(比如/amp/blogs/1),这种冲突会直接导致请求处理失败。

  2. 路径映射不符合应用预期
    当访问/amp/blogs/1时,当前配置下传递给应用的URI是带前缀的/amp/blogs/1,但你的应用根目录是/var/www/html/ro-blog/public,它期望接收的是/1这样的相对路径,这就导致应用找不到对应的资源。

修正后的Nginx配置

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /var/www/html/dist;
    index index.html index.htm;
    server_name 192.168.0.144;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /amp/blogs {
        # 保留请求头设置,确保应用能获取正确的客户端信息
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        
        # 用alias指定应用根目录,末尾加/保证路径映射正确
        alias /var/www/html/ro-blog/public/;
        passenger_enabled on;
        passenger_app_env development;
        
        # 调整try_files,让动态请求能被Passenger正确处理
        try_files $uri $uri/ @passenger;
    }

    # 定义fallback规则,专门处理动态路由请求
    location @passenger {
        passenger_enabled on;
        passenger_app_env development;
        root /var/www/html/ro-blog/public;
    }
}

关键修正点说明

  • 移除多余的proxy_pass:因为你用Passenger直接托管Ruby应用,不需要反向代理到本地8080端口,这个指令完全是多余的,还会导致冲突。
  • 修正alias路径:给alias的路径末尾加上/,这样Nginx会自动把/amp/blogs/1映射到/var/www/html/ro-blog/public/1,符合应用的路径预期。
  • 新增@passenger fallback:对于像/amp/blogs/1这种动态参数路径,静态文件不存在时,会转发到Passenger处理,确保应用能解析路由。

验证步骤

修改配置后,别忘记做这两步:

  • 执行sudo nginx -t检查配置语法是否合法
  • 重启Nginx生效:sudo systemctl restart nginx

现在再测试http://192.168.0.144/amp/blogs/1,应该就能正常访问了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:49:08