即使 url、路由器和控制器指向同一个地方,Laravel 和 Ajax 也会根据请求返回 404

Posted

技术标签:

【中文标题】即使 url、路由器和控制器指向同一个地方,Laravel 和 Ajax 也会根据请求返回 404【英文标题】:Laravel and Ajax returning 404 on request even though the url, router and controller are pointing to the same place 【发布时间】:2021-09-02 16:26:06 【问题描述】:

正如您所见,一切都已正确路由,我还有其他功能可以执行类似的操作并且工作正常,但我不断收到此错误:

POST http://localhost:8000/apagados/4 404(未找到)

删除 http://localhost:8000/apagados/4 404(未找到)

    //Buttons
    <button id="'botRestaurarProjeto'.$apagado['id']" value="$apagado['id']" class="botRestaurarProjeto rounded bg-blue-300 text-white p-2">Restaurar</button>
    <button id="'botEliminarProjeto'.$apagado['id']" value="$apagado['id']" class="botEliminarProjeto rounded bg-red-700 text-white p-2">Excluir</button>

<script>
    $(document).on("click", ".botRestaurarProjeto", function () 
        let id = $(this).val();
        $.ajax(
            method: 'POST',
            url: "apagados/"+id,
            data: 
                "id": id,
            ,
            success: function(result) 
                location.reload();
            ,
            error: function(jqXHR, testStatus, error) 
                // console.log(jqXHR.responseText);
                console.log(testStatus);
                console.log(error);
            
        );
    );

    //AJAX
    $(document).on("click", ".botEliminarProjeto", function () 
        let id = $(this).val();
        if(confirm("Deseja apagar definitivamente?") == true)
            $.ajax(
                method: 'DELETE',
                url: "apagados/"+id,
                data: 
                    "id": id,
                    _method: 'DELETE'
                ,
                success: function() 
                    $("#lixo"+id).hide();
                ,
                error: function(jqXHR, testStatus, error) 
                    console.log(jqXHR.responseText);
                
            );
        
    );
</script>
//ProjetoController
public function eliminar($id)

    $projeto = Projeto::find($id)->withTrashed();
    $projeto->forceDelete();


public function restaurar($id)

    $projeto = Projeto::find($id)->withTrashed();
    $projeto->restore();


//Router
Route::delete('apagados', [ProjetoController::class, 'eliminar'])->name('posts.eliminar'); 
Route::post('apagados', [ProjetoController::class, 'restaurar'])->name('posts.restaurar');

【问题讨论】:

【参考方案1】:

http://localhost:8000/apagados/4 不是您指定的有效路由:

Route::delete('apagados', [ProjetoController::class, 'eliminar'])->name('posts.eliminar'); 
Route::post('apagados', [ProjetoController::class, 'restaurar'])->name('posts.restaurar');

因此,有效的 URL 是 http://localhost:8000/apagados。如果您希望它按预期工作,则必须将路线更改为:

Route::delete('apagados/id', [ProjetoController::class, 'eliminar'])->name('posts.eliminar'); 
Route::post('apagados/id', [ProjetoController::class, 'restaurar'])->name('posts.restaurar');

阅读更多关于Route的信息。

【讨论】:

嘿,非常感谢您的回答,但现在我得到了这个:DELETE localhost:8000/apagados/4 500 (Internal Server Error) POST localhost:8000/apagados/6 500 (Internal Server Error) 即使 CSRF 令牌是正确的配置 所以,我的答案有效,将此答案标记为正确,并创建一个新问题,因为您真正的问题是您无法按预期使用此 URL。 500 与此更改无关,而是在您的控制器中。创建显示控制器和所有内容的新问题,我们将为您提供帮助! (我知道你在这里共享你的控制器,我没有看到任何错误,只需再次显示并添加更多信息,尝试在控制器中使用 dd 助手或查看 Laravel 的日志)

以上是关于即使 url、路由器和控制器指向同一个地方,Laravel 和 Ajax 也会根据请求返回 404的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CakePHP 中的 URL 字符串获取连接的路由?

将指向外部 URL 的超文本链接点击重新路由到 Electron 应用程序以外的另一个浏览器

asp.net 多个 url 指向同一个控制器

我可以将Ingress控制器指向AWS S3等外部服务

如何限制对任何路由的直接访问并抛出 404 异常,即使存在路由?

如何配置重写规则,即使在 URL 中使用别名,请求也会路由到服务器名称