Installing Laravel in a domain subfolder can be useful in certain situations, although it is not officially supported by Laravel creators. In this instruction, I will describe how to configure Laravel 10 in a subfolder and additional tools such as Livewire v3.
Create a .htaccess file in the main installation folder. In this file, rewrite all requests to the public folder:
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]Update the .env file by adding your folder name to the links. Additionally, create APP_DIR with the folder name:
APP_URL=http://localhost/subdir
ASSET_URL=http://localhost/subdir
APP_DIR=subdirAdd your subdirectory env variable to config/app.php:
return [
//...
'dir' => env('APP_DIR'),
//...
];It's a good idea to create a helper that will add a prefix to the paths. I did it in app/Helpers/RouteHelper.php:
use Illuminate\Support\Str;
class RouteHelper
{
public static function getDirPathPrefix(?string $path = ''): string
{
$appDir = config('app.dir');
if (! $appDir) {
return $path;
}
if (Str::length($path) === 0) {
return $appDir;
}
if (Str::startsWith($path, '/')) {
$appDir = Str::start($appDir, '/');
}
return $appDir.Str::start($path, '/');
}
}In the app/providers/RouteServiceProvider.php file, modify the paths by adding prefixes:
$this->routes(function () {
Route::middleware('api')
+ ->prefix(RouteHelper::getDirPathPrefix('api'))
->group(base_path('routes/api.php'));
Route::middleware('web')
+ ->prefix(RouteHelper::getDirPathPrefix())
->group(base_path('routes/web.php'));
});If you use the HOME constant from RouteServiceProvider in the code, change it to a static variable, and then update all occurrences of RouteServiceProvider::HOME to RouteServiceProvider::$HOME:
public static string $HOME = '/dashboard';
public function __construct($app)
{
self::$HOME = RouteHelper::getDirPathPrefix('dashboard');
parent::__construct($app);
}Create a new file named web_custom.php in the routes folder:
use Illuminate\Support\Facades\Route;
use Livewire\Features\SupportFileUploads\FilePreviewController;
use Livewire\Features\SupportFileUploads\FileUploadController;
use Livewire\Livewire;
Livewire::setScriptRoute(fn ($handle) => Route::get('/livewire/livewire.js', $handle));
Livewire::setUpdateRoute(fn ($handle) => Route::post('/livewire/update', $handle));
Route::post('/livewire/upload-file', [FileUploadController::class, 'handle'])
->name('livewire.upload-file');
Route::get('/livewire/preview-file/{filename}', [FilePreviewController::class, 'handle'])
->name('livewire.preview-file');In the routes/web.php file, include the web_custom.php file at the end of the file:
require __DIR__.'/web_custom.php';In this section, the routes are re-declared, which allows Laravel to automatically prepend the subdirectory prefix set earlier in the RouteServiceProvider. This way, there's no need to use RouteHelper::getDirPathPrefix in this section.
After configuration according to the documentation, the admin panel will return a 404. In the app/Providers/AdminPanelProvider.php file, you need to change the path:
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('admin')
->path(RouteHelper::getDirPathPrefix('admin'))
//...
}
}