必须完成ssl证书部署、web服务器https启用、http自动跳转三步闭环操作,缺一不可;直接修改php代码无法启用https,所有加密握手均由nginx或apache完成。

让PHP框架项目在生产环境通过HTTPS安全访问,必须完成SSL证书部署、Web服务器HTTPS启用、HTTP自动跳转三步闭环操作,缺一不可。直接修改PHP代码无法启用HTTPS,所有加密握手均由Nginx或Apache完成。
获取并准备SSL证书文件
使用Let’s Encrypt免费证书最稳妥,避免自签名证书在生产环境触发浏览器拦截。执行Certbot命令前,确保域名DNS已解析到当前服务器且80端口可被公网访问。
运行:sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com,Certbot会自动验证域名所有权、申请证书、写入Nginx配置并重载服务。
证书生成后,默认存于/etc/letsencrypt/live/yourdomain.com/目录下,关键文件为fullchain.pem(含证书+中间链)和privkey.pem(私钥)。【不要手动拆分或编辑这两个文件,否则会导致SSL handshake失败】
若用其他CA颁发的证书,需确认其提供的是PEM格式的完整链证书(即证书内容里已包含中间CA),否则浏览器可能显示“证书不可信”。
Nginx中启用HTTPS并监听443端口
进入站点配置文件(通常位于/etc/nginx/sites-enabled/或/etc/nginx/conf.d/),找到对应server块,替换或新增以下配置:
删除原有listen 80;块中的root、index等重复指令,新建一个独立的HTTPS server块:
server {<br> listen 443 ssl http2;<br> server_name yourdomain.com;<br> ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;<br> ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;<br> ssl_protocols TLSv1.2 TLSv1.3;<br> ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;<br> root /var/www/your-laravel-project/public;<br> index index.php;<br> location / {<br> try_files $uri $uri/ /index.php?$query_string;<br> }<br> location ~ \.php$ {<br> fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;<br> fastcgi_index index.php;<br> include fastcgi_params;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br> }<br>}
注意:root路径必须指向PHP框架的public目录,不是项目根目录;fastcgi_pass路径需与当前PHP-FPM版本一致(如php8.2-fpm.sock),【路径错误会导致502 Bad Gateway】
强制HTTP请求跳转至HTTPS
第一步:在原HTTP server块(listen 80)中添加跳转规则。
第二步:将以下两行插入该server块内,位置在server_name之后、root之前:
return 301 https://$host$request_uri;
第三步:执行sudo nginx -t验证语法,无报错后运行sudo systemctl reload nginx生效。
这一步不能用rewrite替代——rewrite在某些边缘情况下会丢失query string,而return 301能完整保留原始URI参数。
PHP框架内适配HTTPS上下文
方法一:Laravel中,在.env文件末尾添加:APP_URL=https://yourdomain.com,并确保config/app.php中'url' => env('APP_URL', 'http://localhost')未被硬编码覆盖。
方法二:ThinkPHP6,在config/app.php中设置:'https' => true,,同时确认$_SERVER['HTTPS']已被Nginx正确传递(无需额外配置,Certbot生成的Nginx配置已包含fastcgi_param HTTPS on;)。
方法三:Symfony,在.env中设TRUSTED_PROXIES=127.0.0.1,并在config/packages/framework.yaml中启用strict_requirements: null,避免因协议检测异常导致路由匹配失败。
测试时访问http://yourdomain.com,应立即跳转至https://yourdomain.com,地址栏出现锁形图标,且页面所有资源(CSS/JS/图片)均无混合内容警告。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











