You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress前端admin-ajax请求返回404错误,后台正常

全站前端WordPress原生AJAX请求返回404,后台AJAX功能正常

问题详情

近期网站突发异常:全站前端所有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);
}

解决方案建议

  1. 重置固定链接规则
    登录WordPress后台,进入「设置→固定链接」,直接点击「保存更改」(无需修改现有设置),触发WordPress重新生成.htaccess文件中的重写规则。admin-ajax.php的正常访问依赖正确的重写规则,若规则被意外修改会导致404。

  2. 排查Action名称冲突
    尝试修改AJAX action名称(例如将geteventlist改为ars_event_list),同步更新钩子绑定、JS请求中的action参数。部分主题或自定义代码可能存在重名action,导致请求被拦截或无法匹配回调。

  3. 检查服务器安全规则残留
    部分安全插件(如Wordfence、iThemes Security)禁用后,可能在.htaccess或服务器防火墙中残留拦截规则,阻止前端AJAX请求。联系主机服务商检查服务器防火墙,或手动查看.htaccess文件中是否存在针对admin-ajax.php的限制规则。

  4. 简化请求定位问题
    暂时移除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的环节。

  1. 确认站点URL一致性
    进入后台「设置→常规」,检查「WordPress地址(URL)」与「站点地址(URL)」是否完全一致,且为正确的HTTPS地址(若站点启用了HTTPS)。URL不一致可能导致AJAX请求跨域或路径解析错误。

内容的提问来源于stack exchange,提问作者Ishkur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:25:19