跨服务器Nginx+WordPress部署:wp-content/wp-includes 404错误求助
问题描述
服务器1部署Nginx,接收所有请求并转发至服务器2的WordPress站点(域名example.com),Nginx位于Cloudflare后方,使用源站SSL证书。当前站点可正常访问,但访问example.com/wp-content或example.com/wp-includes路径下的静态资源时返回404错误,具体如https://www.example.com/wp-includes/js/clipboard.min.js?ver=2.0.11无法加载,Chrome控制台提示资源MIME类型为text/html,多个静态文件报net::ERR_ABORTED 404 (Not Found)。
错误原因分析
- 静态文件location配置错误:服务器1的Nginx中,针对js/css等静态文件的location块设置了
root /wp-includes,但服务器1本地不存在该路径,且未将静态请求转发至服务器2的PHP-FPM,导致直接返回404。 - SCRIPT_FILENAME适配问题:服务器2的PHP-FPM启用了
chroot = /home/company/server/example/website,而服务器1的Nginx中fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name的设置,会导致PHP-FPM在chroot环境中找不到对应文件路径。 - WP_HOME未强制HTTPS:wp-config.php中
WP_HOME使用http://前缀,与Cloudflare提供的HTTPS访问环境不匹配,可能导致资源路径生成异常。 - 错误引入proxy.conf:
proxy.conf是用于HTTP反向代理的配置,不适用于fastcgi连接PHP-FPM的场景,会导致无效的头信息传递。
修正后的配置示例
1. 服务器1的Nginx配置
server { listen 443 ssl http2; ssl_certificate /home/company/server/ssl/cert.pem; ssl_certificate_key /home/company/server/ssl/private_key.key; server_name example.com www.example.com; gzip on; index index.php index.html; # 遵循WordPress URL重写逻辑,先尝试文件,否则转发至入口文件 location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { include mime.types; include snippets/fastcgi-php.conf; fastcgi_pass 192.168.100.56:9000; # 适配PHP-FPM的chroot环境,传递chroot内部的路径 fastcgi_param SCRIPT_FILENAME /$fastcgi_script_name; include fastcgi_params; fastcgi_intercept_errors on; # 传递Cloudflare相关转发头 fastcgi_param HTTP_X_FORWARDED_PROTO $scheme; fastcgi_param HTTP_X_FORWARDED_HOST $host; fastcgi_param REMOTE_ADDR $remote_addr; } # 禁止访问敏感文件 location ~* \.(htaccess|htpasswd|ini|log|sh|sql|bak|conf)$ { deny all; } }
2. wp-config.php修正
define( 'WP_DEBUG', true ); define( 'CONCATENATE_SCRIPTS', false ); define('FORCE_SSL_LOGIN', true); define('FORCE_SSL_ADMIN', true); # 强制WP_HOME使用HTTPS,匹配Cloudflare访问环境 define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define( 'WP_SITEURL', WP_HOME ); if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on'; if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST']; } if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', __DIR__ . '/' ); } require_once ABSPATH . 'wp-settings.php';
修正说明
- 移除错误的静态文件location块,改用
try_files让所有请求遵循WordPress的URL重写规则,确保静态资源请求能正确到达服务器2的WordPress目录。 - 调整
SCRIPT_FILENAME参数,适配服务器2的PHP-FPM chroot环境,让PHP能找到正确的文件路径。 - 强制
WP_HOME使用HTTPS前缀,避免生成HTTP格式的资源链接。 - 移除对
proxy.conf的引用,避免无效的反向代理头干扰fastcgi连接。
内容的提问来源于stack exchange,提问作者Jason The Dynamite
相关产品推荐
相关产品推荐

