本文目录导读:

在PHP项目中配置HTTPS,主要涉及服务器配置和PHP代码调整两个层面,以下是完整指南:
获取SSL证书
免费证书
- Let's Encrypt(最常用)
- Cloudflare 免费SSL
- 阿里云/腾讯云 免费证书
购买证书
各大云服务商或SSL证书提供商
服务器配置
Apache配置
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/html
# SSL配置
SSLEngine on
SSLCertificateFile /path/to/your_certificate.crt
SSLCertificateKeyFile /path/to/your_private.key
SSLCertificateChainFile /path/to/chain.crt
# PHP配置
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# HTTP重定向到HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
Nginx配置
server {
listen 443 ssl http2;
server_name yourdomain.com;
root /var/www/html;
index index.php;
# SSL配置
ssl_certificate /path/to/your_certificate.crt;
ssl_certificate_key /path/to/your_private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# PHP-FPM配置
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param HTTPS on;
}
# HTTP重定向
location / {
if ($scheme = http) {
return 301 https://$host$request_uri;
}
}
}
# HTTP配置
server {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;
}
IIS配置
在IIS管理器中,选择网站 → 绑定 → 添加https绑定,并选择证书。
PHP代码调整
强制HTTPS(必须在代码入口处添加)
// 在index.php或配置文件中添加
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
$redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header("Location: $redirect_url", true, 301);
exit();
}
安全Cookie设置
// session.cookie_secure - 确保cookie只通过HTTPS传输
session_set_cookie_params([
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
session_start();
// 或者修改php.ini
session.cookie_secure = 1
session.cookie_httponly = 1
检查当前环境
// 检测是否使用HTTPS
function is_https() {
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443
|| (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https');
}
// 生成安全的URL
function secure_url($path = '') {
return 'https://' . $_SERVER['HTTP_HOST'] . '/' . ltrim($path, '/');
}
处理混合内容
// 强制所有URL使用https
function force_https_url($url) {
return str_replace('http://', 'https://', $url);
}
// 检查并修正资源URL
echo str_replace('http://', 'https://', $content);
框架配置(以Laravel为例)
.env文件配置
APP_URL=https://yourdomain.com
中间件强制HTTPS
// app/Http/Middleware/ForceHttps.php
namespace App\Http\Middleware;
use Closure;
class ForceHttps
{
public function handle($request, Closure $next)
{
if (!$request->secure() && env('APP_ENV') === 'production') {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
}
路由中使用HTTPS
URL::forceScheme('https');
Route::get('/page', function() {
return url()->secure('/page');
});
安全建议
配置响应头
// 在代码中添加安全头
header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("X-Content-Type-Options: nosniff");
header("X-Frame-Options: SAMEORIGIN");
header("X-XSS-Protection: 1; mode=block");
数据库连接
// PDO连接时使用ssl
$dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca-cert.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
];
$pdo = new PDO($dsn, $user, $pass, $options);
图片和资源URL
// 在视图中确保资源使用https
<link rel="stylesheet" href="{{ secure_asset('css/app.css') }}">
<script src="{{ secure_asset('js/app.js') }}"></script>
验证配置
-
在线测试工具
-
命令行检查
curl -I https://yourdomain.com openssl s_client -connect yourdomain.com:443
-
PHP测试代码
<?php // 检查SSL证书信息 $cert = stream_context_create([ 'ssl' => [ 'capture_peer_cert' => true, 'verify_peer' => true, ] ]); $result = stream_socket_client("ssl://yourdomain.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $cert); $cert_params = stream_context_get_params($result); $cert_info = openssl_x509_parse($cert_params['options']['ssl']['peer_certificate']); echo "证书有效期至: " . date('Y-m-d', $cert_info['validTo_time_t']);
常见问题
错误
使用https://替换所有http://资源
Cookie问题
// 设置安全的cookie
setcookie("user", $value, [
'expires' => time() + 3600,
'path' => '/',
'secure' => true, // 仅通过HTTPS传输
'httponly' => true,
'samesite' => 'Strict'
]);
重定向循环
确保重定向逻辑正确,不要无限循环
端口问题
本地测试可使用https://localhost:8443
本地开发环境
使用Docker
# docker-compose.yml
version: '3'
services:
nginx:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./certs:/etc/nginx/certs
ports:
- "443:443"
使用PHP内置服务器(开发)
# 生成自签名证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt # 启动HTTPS服务器 php -S localhost:443 -t public --server mksslcert.pem server.pem
通过以上配置,你的PHP项目就可以安全地使用HTTPS协议了,记住要定期更新证书,并持续关注SSL最佳实践。