Laravel URL facade temporarySignedRoute to external url



我使用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'));
}
}

最新更新