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

Laravel项目本地正常线上Delete请求返回405错误求助

解决Laravel线上环境取消点赞返回405错误的问题

兄弟,本地正常线上出405确实挺闹心的,咱们一步步拆解问题,大概率是路由配置或者线上服务器的HTTP方法支持问题,先看最明显的坑:

1. 先修复路由里的语法错误

你的api.php里有个完全无效的路由定义:

Route::delete('likes/{', 'LikesController@remove');

这个语法错误的路由会干扰后面正确的Route::delete('likes/{like}', ...)路由匹配。本地开发环境因为路由是实时加载的,可能没触发冲突,但线上环境一般会生成路由缓存,这个错误路由会直接导致路由解析异常,返回405。立刻删掉这一行!

2. 检查线上服务器的HTTP方法支持

很多宿主环境默认会拦截PUT/DELETE这类非GET/POST的请求,这是405错误的高发原因:

如果你用Apache服务器

确保项目根目录的.htaccess文件包含完整的Laravel重写规则,尤其是处理PUT/DELETE的部分。如果没有,补充以下内容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # 转发PUT/DELETE请求到Laravel入口
    RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE)
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

保存后重启Apache服务。

如果你用Nginx服务器

检查站点配置文件,确保location块允许PUT/DELETE方法,并且正确转发请求到Laravel:

location / {
    try_files $uri $uri/ /index.php?$query_string;
    # 允许合法的HTTP方法,避免拦截PUT/DELETE
    if ($request_method !~ ^(GET|POST|PUT|DELETE|OPTIONS)$ ) {
        return 405;
    }
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 根据你的PHP版本调整路径
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
}

修改后重启Nginx。

3. 确认CSRF令牌和认证正常

你的点赞路由用了auth中间件,要确保:

  • 前端axios请求正确携带了CSRF令牌。在Vue项目里,通常会在bootstrap.js里配置:
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
const token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
}

如果线上环境的CSRF令牌没正确传递,也可能导致请求被拦截(虽然一般是419错误,但偶尔也会表现为405)。

4. 清除线上路由缓存

修改路由后,一定要在服务器上运行以下命令,确保新路由生效:

php artisan route:clear
# 如果线上用路由缓存的话,重新生成缓存
php artisan route:cache

按这几步走下来,应该就能解决线上的405问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:37:31