Docker部署Nginx+WordPress6 自定义友好固定链接报500错误
问题根因
自定义固定链接失效、文章页返回500、后台无法更新内容的核心原因有两点:
- 反向代理路径转发逻辑错误:当前
/blog2/路径块的proxy_pass配置带尾部斜杠,Nginx会把请求路径中的/blog2前缀完全剥离后再转发给WordPress容器。比如访问/blog2/foo-bar/时,实际转发到上游WordPress的路径是/foo-bar/,WordPress无法匹配到对应路由,也没有触发重写规则,直接返回500错误。默认带ID的固定链接是?p=数字ID的查询参数形式,不依赖路径匹配,所以可以正常运行。 - 缺少子路径部署必需的配置:你把WordPress部署在
/blog2子路径下,但既没有给WordPress指定子目录的站点地址,也没有配置对应的重写规则把自定义路径转发到index.php入口,自定义固定链接的路由逻辑完全不生效。
修复步骤
1. 更新docker-compose配置,给WordPress指定子路径地址
在docker-compose.yml的wordpress服务environment段新增配置,明确告诉WordPress它的访问基路径是/blog2:
wordpress: container_name: 'wp' depends_on: - wordpress_db image: wordpress:6.0-php7.4-apache restart: always environment: WORDPRESS_DB_HOST: wordpress_db WORDPRESS_DB_USER: wpu WORDPRESS_DB_PASSWORD: **** WORDPRESS_DB_NAME: wp # 新增以下配置 WORDPRESS_CONFIG_EXTRA: | define('WP_HOME', 'http://domain.tld/blog2'); define('WP_SITEURL', 'http://domain.tld/blog2'); networks: - main-site-network volumes: - wordpress_data:/var/www/html
修改完成后在docker-compose.yml所在目录执行以下命令重启WordPress容器让配置生效:
docker-compose up -d wordpress
2. 修正Nginx配置
替换原来nginx.conf中server块内的location配置,修复代理路径、重写规则、后台跳转问题:
server { listen *:80 default_server; server_name domain.tld; gzip on; gzip_min_length 4096; gzip_buffers 32 128k; gzip_types text/plain text/js text/css text/javascript application/javascript application/x-javascript application/json text/xml; add_header X-Content-Type-Options "nosniff"; add_header Strict-Transport-Security max-age=31536000; client_max_body_size 500m; # 修复后台跳转:匹配所有wp开头的路径(含wp-admin、wp-login.php、静态资源目录),避免漏匹配 location ~ ^/wp- { return 307 https://$server_name/blog2$request_uri; } location /blog2/ { # 注意:proxy_pass不要加尾部斜杠,保留/blog2前缀转发给上游 proxy_pass http://wordpress:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; # 核心重写规则:把所有自定义固定链接路径转给index.php入口 rewrite ^/blog2/(.*)$ /blog2/index.php?q=$1 last; } # 可选:访问/blog2时自动跳转到博客首页 location = /blog2 { return 301 /blog2/; } }
修改完成后执行以下命令重启Nginx加载新配置:
docker-compose restart nginx
3. 重新保存固定链接规则
登录WordPress后台,进入固定链接设置页,重新选择你需要的/%postname%或/%postname%.html结构,点击「保存更改」,WordPress会自动更新内部重写规则。
验证标准
修复完成后按以下顺序确认功能正常:
- 访问
http://domain.tld/blog2/,文章列表加载正常,无静态资源404 - 点击任意文章进入详情页,自定义别名路径正常访问,不返回500错误
- 后台编辑、发布、更新文章操作正常,无报错
- 访问wp-admin后台跳转正常,页面样式加载正常
如果你后续启用HTTPS,记得把之前配置的WP_HOME、WP_SITEURL地址改成https开头,避免出现混合内容报错。
内容的提问来源于stack exchange,提问作者Никита Середа
相关产品推荐
相关产品推荐

