在使用 Docker Compose 和 Nginx 反向代理部署 Hugo 博客时,我遇到了路径重写问题。对 的请求IP/Hugo-Blog/X/Y/Z
被重定向到 ,IP/X/Y/Z
而不是保留/Hugo-Blog/
前缀,导致 404 错误。
但是,当我尝试直接访问IP/Hugo-Blog/X/Y/Z/
(带有尾部斜杠)时,它可以正常工作。
相同的 Hugo 结构在 的 GitHub Pages 上正常工作https://ri-nai.github.io/Hugo-Blog/
。
设置详细信息:
- 基础设施:腾讯云服务器(中国云平台)
- 技术栈: Docker Compose + Nginx 反向代理 + Hugo 静态站点
配置文件:
docker-compose.yaml
:
version: '3'
services:
homepage: # Homepage Site, works fine
...
blog:
build: ./Hugo-Blog
container_name: blog
expose:
- "80"
restart: always
reverse-proxy:
image: nginx:stable-alpine
container_name: reverse-proxy
volumes:
- ./nginx-proxy/default.conf:/etc/nginx/conf.d/default.conf:ro
ports:
- "80:80"
depends_on:
- homepage
- blog
restart: always
Hugo-Blog/Dockerfile
:
FROM hugomods/hugo:exts-0.128.0 AS builder
COPY . .
RUN hugo --minify --baseURL "https://ri-nai.github.io/Hugo-Blog/"
FROM nginx:stable-alpine
COPY --from=builder /src/public /usr/share/nginx/html
nginx-proxy/default.conf
:
server {
listen 80;
server_name IP;
location /Hugo-Blog/ {
proxy_pass http://blog:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://homepage:80/;
# ... same headers
}
}
尝试故障排除:
确认 Hugo 配置在 GitHub Pages 上正常运行
已验证 Docker 容器正在运行且可供内部访问
尝试并期待
请求
IP/Hugo-Blog/about
- 404 上
IP/Hugo-Blog/about
- 随后出现 404
IP/about
- 404 上
预期:行为匹配 GitHub Pages 的 301 → 200 重定向模式,同时保留
/Hugo-Blog/
前缀
proxy_pass
您的错误是指令上游名称后面的斜杠,许多 nginx 新手用户认为这并不重要。然而,它很重要,因为它充当指定上游的URI 部分proxy_pass
。如果您仔细阅读指令文档,您会发现以下内容:与你的
配置片段,您明确告诉 nginx 删除
/Hugo-Blog/
请求 URI 前缀并将其替换为/
。同样,你的
配置片段,您从请求 URI 中剥离
/
它然后将其添加回来,这不会损害代理请求,但会在不必要的操作上浪费一些额外的 CPU 周期。相反,不要在你的上游定义中使用任何 URI 部分:
这样,nginx 在将请求 URI 转发到上游服务器时将保留其原样,防止任何意外的修改。