file($candidate); } } $index = $adminBase.DIRECTORY_SEPARATOR.'index.html'; if (! is_file($index) || ! is_readable($index)) { abort(503, 'Admin index.html is missing or unreadable.'); } $html = @file_get_contents($index); if ($html === false) { abort(503, 'Cannot read admin index.html.'); } return response($html, 200, [ 'Content-Type' => 'text/html; charset=UTF-8', ]); })->where('path', '.*'); /* | H5 uni-app(public/h5):与 admin 相同,在「所有请求经 index.php」的环境下直出 assets、static 等静态资源, | 否则 /h5/assets/*.js、/h5/static/tab/*.png 可能 404,动态 import 与子路径资源会整页白屏。 */ Route::get('/h5/{path?}', function (?string $path = null) { $h5Base = realpath(public_path('h5')); if ($h5Base === false || ! is_dir($h5Base)) { abort(503, 'H5 frontend is not deployed (missing public/h5).'); } if ($path !== null && $path !== '') { $relative = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); $candidate = realpath($h5Base.DIRECTORY_SEPARATOR.$relative); if ($candidate !== false && str_starts_with($candidate, $h5Base) && is_file($candidate) && is_readable($candidate)) { return response()->file($candidate); } } $index = $h5Base.DIRECTORY_SEPARATOR.'index.html'; if (! is_file($index) || ! is_readable($index)) { abort(503, 'H5 index.html is missing or unreadable.'); } $html = @file_get_contents($index); if ($html === false) { abort(503, 'Cannot read H5 index.html.'); } return response($html, 200, [ 'Content-Type' => 'text/html; charset=UTF-8', ]); })->where('path', '.*');