WordPress前端admin-ajax请求返回404错误,后台正常
问题详情
近期网站突发异常:全站前端所有WordPress原生AJAX请求均返回404错误,但后台AJAX功能(如内容编辑、发布)完全正常。前端无论登录/未登录用户发起请求,都会触发404,且请求目标admin_ajax.php地址显示正确。
AJAX调用完全遵循WordPress官方文档规范:已完成脚本本地化、绑定wp_ajax_与wp_ajax_nopriv_钩子、请求中携带nonce安全密钥及必要参数。目前仅能看到自定义JS提示框和404状态,WordPress错误日志、服务器错误日志均无相关报错记录。文件权限为644,该功能此前正常运行数月。
已执行的排查操作:
- 替换全部WordPress核心文件
- 逐个禁用所有插件
- 确认文件权限为644
相关页面:
- 主站:https://www.ars-id.org/
- 报错示例板块:https://www.ars-id.org/evento/
相关代码片段
AJAX钩子代码
add_action('wp_ajax_geteventlist','ajax_event_list'); add_action('wp_ajax_nopriv_geteventlist','ajax_event_list' ); function ajax_event_list() { check_ajax_referer( 'my-ajax-secret', 'security' ); echo "<div>HERE WE ARE</div>"; wp_die(); }
脚本本地化代码
wp_enqueue_script('my-events', get_template_directory_uri().'/js/events.js', array(), null, true ); wp_localize_script( 'my-events', 'my_ajax', array( 'url' => admin_url('admin-ajax.php'), 'security' => wp_create_nonce( 'my-ajax-secret' ) ));
JavaScript请求代码
function getEventList(offset) { var request = new XMLHttpRequest(); request.open('POST', my_ajax.url, true); request.timeout = requestTimeout; request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;'); request.onload = function () { if (this.status >= 200 && this.status < 400) { // populate document body } else { alert("An error ocurred while fetching event list. Please try again"); } }; var reqString = '&action=geteventlist&security='+my_ajax.security+'&e_offset='+offset; request.send(reqString); }
解决方案建议
重置固定链接规则
登录WordPress后台,进入「设置→固定链接」,直接点击「保存更改」(无需修改现有设置),触发WordPress重新生成.htaccess文件中的重写规则。admin-ajax.php的正常访问依赖正确的重写规则,若规则被意外修改会导致404。排查Action名称冲突
尝试修改AJAX action名称(例如将geteventlist改为ars_event_list),同步更新钩子绑定、JS请求中的action参数。部分主题或自定义代码可能存在重名action,导致请求被拦截或无法匹配回调。检查服务器安全规则残留
部分安全插件(如Wordfence、iThemes Security)禁用后,可能在.htaccess或服务器防火墙中残留拦截规则,阻止前端AJAX请求。联系主机服务商检查服务器防火墙,或手动查看.htaccess文件中是否存在针对admin-ajax.php的限制规则。简化请求定位问题
暂时移除check_ajax_referer验证,简化回调函数仅返回测试文本,同时简化JS请求仅传递action参数:
// 简化后的AJAX回调 function ajax_event_list() { echo "TEST RESPONSE"; wp_die(); }
// 简化后的JS请求 var reqString = 'action=geteventlist'; request.send(reqString);
若简化后请求正常响应,再逐步添加nonce验证、其他参数,定位具体触发404的环节。
- 确认站点URL一致性
进入后台「设置→常规」,检查「WordPress地址(URL)」与「站点地址(URL)」是否完全一致,且为正确的HTTPS地址(若站点启用了HTTPS)。URL不一致可能导致AJAX请求跨域或路径解析错误。
内容的提问来源于stack exchange,提问作者Ishkur

