Nginx配置:仅根路径返回静态文件,其余路由走API重定向
问题原因
你当前配置的问题在于:访问根路径/时,Nginx会通过index指令触发内部重定向,把请求转向/index.html。而location = /是精确匹配,不会匹配/index.html,导致这个请求被第二个location /捕获,转发到API,最终根路径无法返回静态的index.html文件。
解决方案
下面两种方案都能解决这个问题,任选其一即可:
方案一:新增匹配/index.html的location块
专门处理内部重定向过来的/index.html请求,确保它走静态文件服务:
server { listen 443 ssl; server_name domain.com; ... # 处理根路径请求 location = / { root /usr/share/nginx/html; index index.html; } # 处理内部重定向的index.html请求 location = /index.html { root /usr/share/nginx/html; } # 其余所有路由转发到API location / { proxy_pass http://api:3000/v1/urls/redirect$uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
方案二:用try_files替代index,避免内部重定向
直接指定返回根路径的静态文件,跳过内部重定向步骤:
server { listen 443 ssl; server_name domain.com; ... # 直接返回根路径的静态文件,无内部重定向 location = / { root /usr/share/nginx/html; try_files /index.html =404; } # 其余所有路由转发到API location / { proxy_pass http://api:3000/v1/urls/redirect$uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
额外说明
如果你的根路径页面依赖CSS、JS、图片等静态资源,这些资源请求也需要走静态文件服务的话,得额外添加对应的location规则,比如:
# 匹配/static/开头的静态资源 location /static/ { root /usr/share/nginx/html; } # 或者按文件后缀匹配 location ~* \.(css|js|png|jpg|svg)$ { root /usr/share/nginx/html; expires 1d; # 可选:设置缓存过期时间 }
内容的提问来源于stack exchange,提问作者Orkhan Karimov
相关产品推荐
相关产品推荐

