14four/laravel-force-https
Laravel middleware package to force HTTPS across your app. Automatically redirects HTTP requests to HTTPS, with options to exclude paths or environments so you can keep local/testing flexible while enforcing secure connections in production.
Installation
composer require 14four/laravel-force-https
Publish the config file (if needed):
php artisan vendor:publish --provider="14Four\ForceHttps\ForceHttpsServiceProvider"
Basic Usage
Add the middleware to your app/Http/Kernel.php:
protected $middleware = [
// ...
\FourteenFour\ForceHttps\ForceHttpsMiddleware::class,
];
First Use Case Immediately enforce HTTPS for all requests to your Laravel app. No additional configuration is required for default behavior.
Domain-Specific Rules
Override default behavior via config/force-https.php:
'domains' => [
'app.example.com' => true, // Force HTTPS
'staging.example.com' => false, // Allow HTTP
],
Conditional Enforcement Use middleware groups or route-specific middleware:
Route::middleware(['force.https'])->group(function () {
// Routes requiring HTTPS
});
Custom Logic via Events
Extend functionality by listening to https-forced events:
event(new \FourteenFour\ForceHttps\Events\HttpsForced($request, $response));
Reverse Proxy Support
If behind Nginx/Apache, ensure X-Forwarded-Proto headers are trusted:
'trusted_proxies' => ['192.168.1.1'], // Your proxy IP
Local Development
Exclude local domains (e.g., localhost, *.test) from HTTPS enforcement:
'exceptions' => [
'localhost',
'*.test',
],
API Endpoints Disable HTTPS for internal APIs:
Route::middleware(['api', 'throttle', 'force.https:disable'])->group(...);
Mixed Content Warnings
mix.options.https = true or secure_assets() helper.Redirect Loops
php artisan route:list | grep force.https
Caching Headers
php artisan cache:clear
php artisan config:clear
Log Redirects
Enable debug mode in config/force-https.php:
'debug' => env('APP_DEBUG', false),
Check Laravel logs (storage/logs/laravel.log) for forced HTTPS events.
Test with curl
Verify redirects:
curl -v http://yourdomain.com
Custom Middleware Extend the base middleware:
namespace App\Http\Middleware;
use FourteenFour\ForceHttps\ForceHttpsMiddleware;
class CustomForceHttps extends ForceHttpsMiddleware {
protected function shouldForceHttps($request) {
// Custom logic
return parent::shouldForceHttps($request);
}
}
Dynamic Rules Use a closure in config:
'domains' => function ($request) {
return $request->ip() === '123.123.123.123' ? false : true;
},
Event Listeners Modify responses post-forcing:
\Event::listen(\FourteenFour\ForceHttps\Events\HttpsForced::class, function ($event) {
$event->response->headers->set('Strict-Transport-Security', 'max-age=31536000');
});
How can I help you explore Laravel packages today?