<罢工> 在您否决我是否要发布有关此错误的另一个问题,或将其标记为重复或其他内容之前,我的问题有所不同
这些是导致此错误的我的已知原因:
POST
,路由使用GET
csrf
令牌我已经检查了这两个原因:
csrf
中的csrf
验证中间件来禁用app/Http/Kernel.php
验证,但仍然收到此错误(这是正确的方法吗?)基本上,这两个是我所知道的,也是我在这里搜索时发现的。
所以我的问题是:
如果您想查看我的代码:
Route::post('/export', [
'as' => 'export.csv',
'uses' => 'ToolsController@export'
]);
<form class="form-inline" action="{{ route('export.csv') }}" id="csv_export" method="post">
{{ csrf_field() }}
<input type="hidden" name="type" value="site_maps">
<input type="hidden" name="id" value="{{ request('id') }}">
<button type="submit" class="btn btn-primary">Export to CSV</button>
</form>
namespace App\Http\Controllers;
class ToolsController extends Controller
{
public function export(Request $request)
{
// some function
}
}
有一个 XSRF-TOKEN
cookie集,试图在浏览器上将其删除,但它再次出现。
POST /export HTTP/1.1
Host: somehost.com
Connection: keep-alive
Content-Length: 68
Pragma: no-cache
Cache-Control: no-cache
Origin: http://somehost.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Save-Data: on
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://somehost.com/map/47
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,id-ID;q=0.8,id;q=0.7
Cookie: sso_token_33=--some-key--; XSRF-TOKEN=--some-token--; somehost_session=--some-cookie--
_token=--some-other-token--&type=site_maps&id=47
<罢工> 没有路线分组
我有一个奇怪的情况,如下图所示,浏览器正确发送了POST请求,但是laravel似乎将其视为GET请求, 是否有任何Apache设置会导致此行为?
路线列表:
+--------+----------+----------------+----------------+-------------------------------------------------+--------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+----------------+----------------+-------------------------------------------------+--------------+
| | POST | export | export.csv | App\Http\Controllers\ToolsController@export | web |
| | GET|HEAD | map/{id} | pages.show | App\Http\Controllers\PagesController@show | web |
| | GET|HEAD | tree | pages.tree | App\Http\Controllers\PagesController@tree | web |
+--------+----------+----------------+----------------+-------------------------------------------------+--------------+
答案 0 :(得分:1)
MethodNotAllowedHttpException
。这意味着所有这些条件都是正确的:
_method
表单字段X-HTTP-Method-Override
标头OPTIONS
某些路由定义允许多种方法。例如,Route::get()
将GET和HEAD定义为可接受。
该错误实际上很明显(请求使用了错误的方法),但是原因有时更微妙。从最明显到最不明显,这是常见原因:
Route::post()
的路由_method
字段:path
和:method
与URI进行比较和php artisan route:list
Route::group()
内定义路由可能已添加了URL前缀,例如api/
或admin/
-这将在route:list
上可见users/active
之前定义users/{user}
,否则{user}
路由变量将与'active'
匹配如果仍然没有发现问题,请尝试修改开发人员工具的“网络”标签中“请求标头”中复制的路径>
如果所有 still 看起来都正确,则可能是时候开始检查Apache / Nginx / IIS配置了,特别是查找重定向/重写情况,例如添加/删除子域(如www)或https 或者,如果抛出相同的异常,则尝试不使用$方法并仔细检查响应: csrf令牌问题将不会引起此错误。相反,这将引发不同的异常,例如 由于这是Laravel / Symfony异常,因此应该排除IIS / Apache / Nginx问题(除非重写规则拦截了请求)。例如,IIS默认情况下禁用了一些动词(PUT,DELETE等),但在这种情况下,它将显示IIS 405错误页面。$ php artisan tinker
>>> $uri = '/your/requested/path'
>>> $method = 'POST'
>>> app('router')->getRoutes()->match(app('request')->create($uri, $method))
=> Illuminate\Routing\Route {#191
+uri: "...",
...
>>> app('router')->getRoutes()->match(app('request')->create($uri))
TokenMismatchException
,或者在某些情况下可能会出现授权错误。同样,Cookie问题不应导致此类错误。