复制代码

为懒人提供无限可能,生命不息,code不止

人类感性的情绪,让我们知难行难
我思故我在
日拱一卒,功不唐捐
  • 首页
  • 前端
  • 后台
  • 数据库
  • 运维
  • 资源下载
  • 实用工具
  • 接口文档工具
  • 登录
  • 注册

nginx

【原创】解决nginx的ssl证书正常,tomcat内项目接口或静态文件请求不带https的问题

作者: whooyun发表于: 2024-10-03 23:57

nginx配置

server {
    listen 443 ssl;
    server_name fuzhicode.com;

    ssl_certificate    /www/server/panel/vhost/cert/fuzhicode.com/fullchain.pem;
    ssl_certificate_key /www/server/panel/vhost/cert/fuzhicode.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;   # 反向代理到 Tomcat
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;  # 传递协议(http 或 https)

        # 不使用 X-Forwarded-Port
        # 直接在子过滤中处理 http:// 替换为 https://,这种方式如果在并发量非常大的服务中会影响性能
		#sub_filter 是 Nginx 中的一个指令,用于在 Nginx 代理或静态文件服务器的响应中执行文本替换。它可以用来动态地修改 HTTP 响应内容,通常用于以下情况:
        #协议替换:例如,将 http:// 替换为 https://,确保页面中的所有链接和资源引用使用 HTTPS 协议。
        #路径修改:例如,调整资源路径,使其指向正确的 CDN 或其他资源位置。
        #定制化内容:根据特定需求修改响应内容,例如插入或替换特定的 HTML 标签。
        sub_filter 'http://' 'https://';
        sub_filter_once off; #允许多次修改
    }
}
tomcat的server.xml 中的host增加配置(有就不需要加),让tomcat正确接收nginx传过来的协议和端口

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
<Valve className="org.apache.catalina.valves.RemoteIpValve" />
<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="X-Forwarded-For"
       proxiesHeader="X-Forwarded-By"
       protocolHeader="X-Forwarded-Proto" />
第二种知识点扩展:

nginx需要配置证书,tomcat也配置证书,这种方式比较恶心。还不如直接将域名解析到tomcat上,牺牲部分性能和系统安全性

可以直接在tomcat的server.xml中配置证书

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" 
           scheme="https" secure="true" 
           clientAuth="false" sslProtocol="TLS" 
           keystoreFile="路径/到/keystore.jks" 
           keystorePass="your_keystore_password" />
nginx需要做反向代理
server {
    listen 80;
    server_name example.com www.example.com;

    # 自动重定向 HTTP 到 HTTPS
    return 301 https://$host$request_uri;
}

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

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass https://localhost:8443;  # 反向代理到 Tomcat 的 8443 端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}