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
相关产品推荐
相关产品推荐

