本文介绍如何在Nginx和Apache环境下配置HTTPS全站强制跳转,确保网站所有流量都通过加密通道访问。

为什么需要强制HTTPS

原因 说明
安全性 防止中间人攻击
SEO Google优先收录HTTPS
信任度 浏览器显示安全标识
合规 PCI DSS等合规要求

Nginx配置

基本跳转配置

在 server 配置中添加:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;

    # 强制HTTPS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    root /var/www/html;
    index index.php index.html;
}

只跳转首页

server {
    listen 80;
    server_name example.com;

    location = / {
        return 301 https://$server_name$request_uri;
    }

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

Apache配置

启用重写模块

sudo a2enmod rewrite
sudo systemctl restart apache2

.htaccess配置

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

httpd.conf配置

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
</VirtualHost>

HSTS配置

HTTP Strict Transport Security强制浏览器使用HTTPS:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
参数 说明
max-age HSTS有效期(秒)
includeSubDomains 包含子域名
preload 申请预加载列表

Cloudflare强制HTTPS

在Cloudflare控制台设置:

  1. SSL/TLS → 加密模式:完全灵活或完全严格
  2. 页面规则
  3. URL:http://*example.com/*
  4. 设置:始终使用HTTPS
  5. 转发规则:301永久重定向

验证配置

测试命令

curl -I http://example.com

curl -I https://example.com

curl -I https://example.com | grep Strict-Transport

Google浏览器验证

  1. 打开开发者工具(F12)
  2. Network标签
  3. 访问 http://example.com
  4. 查看Status是否为301,Location是否为https://

常见问题

问题 解决方案
跳转循环 检查HTTPS是否也监听80端口
证书错误 更新SSL证书
资源加载失败 内部链接使用协议相对路径
移动端问题 检查重定向状态码是否为301

完整Nginx配置示例

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

    root /var/www/html;
    index index.php index.html;

    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
}

配置完成后,网站所有HTTP请求都将自动跳转到HTTPS安全连接。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。