我使用Laravel 8生成一个临时签名路由并传递一些参数,但我希望我的URL能将我带到我选择的某个URL,而不是我项目中的页面。
就上下文而言,我的Laravel 8项目是一个API,因此没有视图,然后我的API被一个用Nuxt编写的前端项目使用。
我尝试将我的URL添加到temporarySignedRoute
的第一个arg中,但它表示找不到我的路由。
$verifyURL = URL::temporarySignedRoute(
'https://example.com/account/verify', Carbon::now()->addHours(24), ['contact' => 5, 'team' => 'john']
);
我缺少什么,或者这里有什么解决方法?
更新
因此,我不需要将用户带到外部URL,但URL::temporarySignedRoute
似乎生成了错误的URL。
我生成的URL的开头是(例如(https://example.com/api/contact/verify并且我需要URLhttps://api.example.com/api/contact/verify
所以同一个域,除了一个子域。
看起来APP_URL
没有被读取,因为我更改了它,它没有影响,而且它在其他地方使用,所以我尝试用更新URL
$verifyURL = URL::temporarySignedRoute(
'contact.verify', Carbon::now()->addHours(24), ['contact' => 5, 'team' => 'john]
);
// fix for wrong URL
$verifyURL = str_replace('example.com', 'api.example.com', $verifyURL);
然而,当点击$verifyURL
提供的链接时,这似乎有一个无效的签名?如何在开始时获得api
部分?
URL::temporarySignedRoute((有第四个名为$absolute的参数,它是一个布尔值。因此,如果你想预先设置一个自定义url,而不是Laravel使用的默认url,这是要更改的变量。
$absolute的默认值为true。因此,为了准备您自己的自定义url,请确保首先将其更改为false,如下所示:
$verifyURL = URL::temporarySignedRoute(
'contact.verify', Carbon::now()->addHours(24), ['contact' => 5, 'team' => 'john], false // The $absolute value
);
然后连接你的自定义网址:
$your_custom_url . $verifyURL;
第一步,在AppServiceProvider
引导方法中,您需要注册自定义URL签名:
public function boot()
{
// This allows us to generate a temporary url for report downloading
Storage::disk('reports')->buildTemporaryUrlsUsing(function ($path, $expiration, $options) {
return URL::temporarySignedRoute(
'report.download',
$expiration,
array_merge($options, ['path' => $path])
);
});
}
创建URL:
Storage::disk('reports')->temporaryUrl($pathname, Carbon::now()->addSeconds(10))
要下载文件,这是我的控制器:
<?php
declare(strict_types=1);
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Storage;
use URL;
class ReportDownloadController extends Controller
{
public function download(Request $request)
{
if (!URL::signatureHasNotExpired($request)) {
return response('The URL has expired.');
}
if (!URL::hasCorrectSignature($request)) {
return response('Invalid URL provided');
}
return Storage::disk('reports')->download($request->get('path'));
}
}