Docker Compose部署WordPress:Nginx重写wp-admin至登录页失败问题
问题
用docker-compose容器化部署WordPress后,访问http://localhost/wp-admin时Nginx返回404错误,但http://localhost/wp/wp-login.php能正常打开。我加了这条Nginx重写规则还是没用:
rewrite ^wp-admin$ wp/wp-login.php last;
完整的Nginx配置如下:
server { listen 80; server_name localhost; root /var/www/html/web; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; # add url to login as admin rewrite ^wp-admin$ wp/wp-login.php last; # fix slash rewrite ^/(.*)/$ /$1 permanent; location ~ \.php$ { fastcgi_pass php:9000; try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
为啥重写规则没用?
- 匹配范围太窄:你写的
^wp-admin$只能精确匹配不带斜杠的wp-admin,但实际访问时浏览器经常会自动在末尾加斜杠(变成wp-admin/),这时候规则就匹配不上了。 - 路径解析出错:重写的目标
wp/wp-login.php是相对路径,Nginx会基于当前请求路径拼接,容易导致最终路径错误,应该用绝对路径(前面加/)。 - 不符合WordPress路由逻辑:WordPress的
wp-admin本身是个目录,直接重写到wp-login.php跳过了目录索引处理,而且后续的try_files规则会优先检查文件是否存在,重写后的路径可能没被正确传递到PHP处理块。
解决办法
办法1:修改重写规则,覆盖所有情况
把原来的重写规则换成下面这条,同时匹配带斜杠/不带斜杠的请求,并且用绝对路径指向登录页:
rewrite ^/wp-admin(/.*)?$ /wp/wp-login.php last;
^/wp-admin(/.*)?$能匹配/wp-admin、/wp-admin/甚至/wp-admin/xxx这类请求/wp/wp-login.php是绝对路径,确保Nginx能正确找到文件位置
办法2:正确映射wp-admin目录(更规范)
如果想让wp-admin直接指向后台管理目录而不是跳登录页,给wp-admin单独配置location块:
location ^~ /wp-admin { alias /var/www/html/web/wp/wp-admin; index index.php; try_files $uri $uri/ /wp/wp-admin/index.php?$args; location ~ \.php$ { fastcgi_pass php:9000; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } }
这样访问/wp-admin会直接加载WordPress后台的目录索引,后续子页面也能正常访问。
办法3:调整WordPress站点URL(最推荐)
先通过/wp/wp-login.php登录后台,到设置-常规里修改两个URL:
- WordPress地址(URL):
http://localhost/wp - 站点地址(URL):
http://localhost
保存后WordPress会自动处理路由规则,不用改Nginx配置,直接访问http://localhost/wp-admin就能正常进入后台了。
内容的提问来源于stack exchange,提问作者PatrickVL
相关产品推荐
相关产品推荐

