Nginx动态路由调用问题:/amp/blogs/1无法访问求助
解决Nginx中/amp/blogs可访问但/amp/blogs/1无法访问的问题
我仔细看了你的Nginx配置,问题主要出在location /amp/blogs块里的指令冲突和路径处理逻辑上,咱们一步步来修正:
核心问题分析
指令互斥导致请求混乱
你在同一个location块里同时写了proxy_pass和passenger_enabled——这两个指令是互斥的,Nginx不知道该把请求交给反向代理还是Passenger处理,对于带参数的路径(比如/amp/blogs/1),这种冲突会直接导致请求处理失败。路径映射不符合应用预期
当访问/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,符合应用的路径预期。 - 新增
@passengerfallback:对于像/amp/blogs/1这种动态参数路径,静态文件不存在时,会转发到Passenger处理,确保应用能解析路由。
验证步骤
修改配置后,别忘记做这两步:
- 执行
sudo nginx -t检查配置语法是否合法 - 重启Nginx生效:
sudo systemctl restart nginx
现在再测试http://192.168.0.144/amp/blogs/1,应该就能正常访问了。
内容的提问来源于stack exchange,提问作者Jigar Bhatt
相关产品推荐
相关产品推荐

