方法405是不允许的,但是在我定义的API路由中POST
Method 405 is not allowed, but in the API routing I defined POST
我正在 Laravel 和 Vue 的帮助下创建一个 SPA,并且路由以前工作过,但出于某种原因,它现在给我这个错误:“不允许使用方法 405”。
这是我收到的警告消息:
[弃用] 该网站从网络请求了一个子资源,由于其用户的特权网络位置,它只能访问该子资源。这些请求将非 public 设备和服务器暴露给互联网,增加了跨站点请求伪造 (CSRF) 攻击的风险,and/or 信息泄露。为了减轻这些风险,Chrome 弃用了从 public 发起的对非 public 子资源的请求非安全上下文,并将在 Chrome 92(2021 年 7 月)开始阻止它们。有关详细信息,请参阅 https://chromestatus.com/feature/5436853517811712。“
这是调用 API 的函数:
axios.post('api/molliepayment', { products, totalPrice }).then(response => {
window.location.href = response.data.data._links.checkout.href;
}).catch(() => {});
这是 API 路由文件:
Route::post('molliepayment', [OrderController::class, 'preparePayment'])->name('mollie.payment');
最后,这是 Vue-Router:
{
path: '/checkout',
component: Checkout,
children: [
{
path: '',
component: Address,
},
{
path: '/checkout/payment',
component: Payment,
},
{
path: '/checkout/confirm',
component: OrderCheck,
}
],
meta: {
requiresAuth: true,
}
},
需要注意的一件事:我正在使用 SSH 隧道
这是我的 beforeMount():
axios.defaults.headers.common['Content-Type'] = 'application/json'
axios.defaults.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem('vue-laravel-ecommerce.jwt')
这是我的 cors.php 配置:
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
额外信息
我认为这是在我开始使用子路由之后发生的。
请求 axios.post('api/molliepayment'...
指的是亲戚 URL,这意味着如果您是目前在 /checkout/payment
它会向 http://example.com/checkout/payment/api/molliepayment
发出请求,如果你有一个 SPA 和一个“包罗万象”的路线来加载索引,那么这就是这个请求会遇到的问题,大概 POST 不允许这样的请求。
您可以使用 axios.post('/api/molliepayment'...
来解决这个问题,但更好的方法是通过您的 .blade.php 视图传递实际的完整 URL,例如
<script>
window.molliepaymentURL = '{{ route('mollie.payment' }}';
</script>
并使用axios.post(window.molliepaymentURL...
这将允许您更改路由路径而无需更改 JS,此外,如果您使用 Laravel 根是子路径的不常见主机设置,它也不会中断
我正在 Laravel 和 Vue 的帮助下创建一个 SPA,并且路由以前工作过,但出于某种原因,它现在给我这个错误:“不允许使用方法 405”。
这是我收到的警告消息:
[弃用] 该网站从网络请求了一个子资源,由于其用户的特权网络位置,它只能访问该子资源。这些请求将非 public 设备和服务器暴露给互联网,增加了跨站点请求伪造 (CSRF) 攻击的风险,and/or 信息泄露。为了减轻这些风险,Chrome 弃用了从 public 发起的对非 public 子资源的请求非安全上下文,并将在 Chrome 92(2021 年 7 月)开始阻止它们。有关详细信息,请参阅 https://chromestatus.com/feature/5436853517811712。“
这是调用 API 的函数:
axios.post('api/molliepayment', { products, totalPrice }).then(response => {
window.location.href = response.data.data._links.checkout.href;
}).catch(() => {});
这是 API 路由文件:
Route::post('molliepayment', [OrderController::class, 'preparePayment'])->name('mollie.payment');
最后,这是 Vue-Router:
{
path: '/checkout',
component: Checkout,
children: [
{
path: '',
component: Address,
},
{
path: '/checkout/payment',
component: Payment,
},
{
path: '/checkout/confirm',
component: OrderCheck,
}
],
meta: {
requiresAuth: true,
}
},
需要注意的一件事:我正在使用 SSH 隧道
这是我的 beforeMount():
axios.defaults.headers.common['Content-Type'] = 'application/json'
axios.defaults.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem('vue-laravel-ecommerce.jwt')
这是我的 cors.php 配置:
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
额外信息 我认为这是在我开始使用子路由之后发生的。
请求 axios.post('api/molliepayment'...
指的是亲戚 URL,这意味着如果您是目前在 /checkout/payment
它会向 http://example.com/checkout/payment/api/molliepayment
发出请求,如果你有一个 SPA 和一个“包罗万象”的路线来加载索引,那么这就是这个请求会遇到的问题,大概 POST 不允许这样的请求。
您可以使用 axios.post('/api/molliepayment'...
来解决这个问题,但更好的方法是通过您的 .blade.php 视图传递实际的完整 URL,例如
<script>
window.molliepaymentURL = '{{ route('mollie.payment' }}';
</script>
并使用axios.post(window.molliepaymentURL...
这将允许您更改路由路径而无需更改 JS,此外,如果您使用 Laravel 根是子路径的不常见主机设置,它也不会中断