NGINX分目录部署Laravel与WordPress时wp-admin无法访问
wp-admin路径无法访问的核心原因
- 斜杠自动补全缺失:访问
example.com/blog/wp-admin时默认不带末尾斜杠,Nginx不会自动识别这是目录请求,既不会触发目录索引查找,也不会自动301补斜杠,直接返回文件不存在的错误。 - 回退路径匹配错误:
/blog/块内的try_files最后一个回退路径/blog/index.php是相对于server级root(Laravel的public目录)解析的,不会读取alias指向的WordPress目录下的index.php,路径不存在时会直接fallback到Laravel的路由规则,返回Laravel的404页面。 - 规则冲突:同一块内同时写了
if (!-e $request_filename)的rewrite逻辑和try_files逻辑,两者优先级冲突,会导致部分WP后台路径重写异常。 - PHP解析参数错误:嵌套的PHP location块内
fastcgi_split_path_info规则和alias路径不匹配,访问WP后台PHP脚本时会传递错误的脚本路径给PHP-FPM,导致脚本找不到。
修正方案
前置WordPress配置
先修改WordPress部署目录下的wp-config.php,添加以下两行配置,固定WP的子目录访问地址,避免后台循环跳转:
define('WP_HOME', 'https://example.com/blog'); define('WP_SITEURL', 'https://example.com/blog');
如果之前是子域名部署,还需要修改数据库wp_options表中siteurl和home两个字段的值为上述地址,替换旧的子域名链接。
修正后的NGINX配置
server { listen 80; server_name example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name example.com; charset utf-8; ssl_certificate /etc/ssl/example.crt; ssl_certificate_key /etc/ssl/example.key; root /var/www/vhosts/example.com/httpdocs/laravel/public; index index.html index.htm index.php; # Laravel主站规则 location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 403 /index.php; error_page 404 /index.php; # 主站PHP解析规则 location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 180; include fastcgi_params; } ## WordPress /blog 子路径配置 # 自动给wp-admin目录补末尾斜杠,解决目录访问异常 rewrite ^/blog/wp-admin$ $scheme://$host$uri/ permanent; location ^~ /blog { alias /var/www/vhosts/example.com/httpdocs/wordpress; # 静态资源直接返回,不转发PHP解析 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires max; log_not_found off; access_log off; } # WordPress路径重写 if (!-e $request_filename) { rewrite ^/blog/(.*)$ /blog/index.php?q=$1 last; } # WordPress PHP解析规则 location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_read_timeout 180; include fastcgi_params; } } location ~ /\.(?!well-known).* { deny all; } }
配置调整说明
- 替换80端口的rewrite规则为
return 301,跳转效率更高 - 新增wp-admin路径斜杠补全规则,避免不带斜杠访问时的解析错误
- 删除/blog块内冲突的try_files规则,避免回退路径错误指向Laravel目录
- 移除PHP块内不匹配alias规则的
fastcgi_split_path_info配置,直接用$request_filename传递正确的WordPress脚本路径给PHP-FPM - 新增WordPress静态资源匹配规则,避免图片、样式、脚本等静态资源被Laravel规则拦截或错误转发给PHP解析
- 调整/blog路径匹配规则,兼容带/不带末尾斜杠的访问场景
上线操作步骤
- 执行
nginx -t检查配置语法是否正确 - 语法验证通过后执行
nginx -s reload重载配置 - 若WordPress安装了缓存、安全类插件,需在插件设置中更新站点地址为新的子路径地址,避免插件自带的跳转规则导致后台访问异常
内容的提问来源于stack exchange,提问作者bjjn
相关产品推荐
相关产品推荐

