在Laravel应用中配置HTTPS/SSL需先完成服务器层证书部署,再通过框架层设置确保安全链接生成与请求处理。以下是具体步骤:
一、服务器层配置SSL证书Laravel本身不处理SSL加密,需依赖Web服务器(如Nginx/Apache)实现。
- Nginx配置示例在站点配置中指定证书路径并监听443端口:server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; root /var/www/laravel-project/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }}
- Apache配置示例启用SSL模块并配置虚拟主机:<VirtualHost *:443> ServerName yourdomain.com DocumentRoot /var/www/laravel-project/public SSLEngine on SSLCertificateFile "/path/to/certificate.crt" SSLCertificateKeyFile "/path/to/private.key" <Directory "/var/www/laravel-project/public"> AllowOverride All Require all granted </Directory></VirtualHost>
二、强制Laravel使用HTTPS证书加载后,需通过中间件和环境变量确保应用生成安全链接。
- 配置TrustProxies中间件修改app/Http/Middleware/TrustProxies.php,允许Laravel识别反向代理的HTTPS请求:protected $proxies = '*'; // 信任所有代理protected $headers = Request::HEADER_X_FORWARDED_ALL; // 接受所有代理头
- 设置APP_URL为HTTPS在.env文件中更新应用基础URL:APP_URL=
https://yourdomain.com
- 强制HTTP重定向到HTTPS
方法1:自定义中间件创建app/Http/Middleware/ForceHttps.php:public function handle($request, $next) { if (!$request->secure() && app()->environment('production')) { return redirect()->secure($request->getRequestUri()); } return $next($request);}在app/Http/Kernel.php中注册中间件并应用于全局路由组:protected $middleware = [ AppHttpMiddlewareForceHttps::class,];
方法2:修改RedirectIfAuthenticated(仅限认证路由)若需仅对认证路由重定向,可修改app/Http/Middleware/RedirectIfAuthenticated.php中的逻辑。
三、生成安全URL和资源链接Laravel的辅助函数会自动适配HTTPS,但需注意以下细节:
- 自动协议判断url()、asset()等函数会根据当前请求协议生成链接。若部署在负载均衡或CDN后,需确保X-Forwarded-Proto头被正确传递,否则可能导致重定向循环。
- 强制资源走HTTPS使用secure_asset()替代asset()生成强制HTTPS的资源链接:// Blade模板示例<img src="{{ secure_asset('images/logo.png') }}" alt="Logo">
- Blade模板最佳实践推荐使用asset()而非硬编码路径,Laravel会自动处理协议适配:// 自动适配HTTPS(需X-Forwarded-Proto支持)<link href="{{ asset('css/app.css') }}" rel="stylesheet">
关键注意事项- 证书有效性确保证书文件路径正确且权限可读(通常为644)。
- 代理头支持若使用Nginx反向代理到Apache/PHP-FPM,需在Nginx配置中添加:proxy_set_header X-Forwarded-Proto $scheme;
- 测试环境排除在.env中设置APP_ENV=local可避免本地开发时强制HTTPS。
- 混合内容警告检查页面是否存在HTTP资源引用(如图片、脚本),此类内容会被浏览器拦截。
通过以上步骤,可实现Laravel应用从服务器证书部署到框架层安全链接生成的完整HTTPS配置。核心逻辑为服务器层加密流量 + 框架层信任代理头并统一输出HTTPS链接,两者缺一不可。