通过https访问nginx后转发到tomcat后还是http

本文介绍如何配置Nginx与Tomcat实现HTTPS访问,解决因协议不一致导致的静态文件加载失败问题。通过调整Nginx的proxy_set_header及Tomcat的RemoteIpValve设置,确保跨服务器间正确传递协议类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.itapes.cn/?p=154

可能文章标题写的不够明白
介绍下出现的情况:
系统部署在tomcat下,nginx做转发代理,浏览器通过地址先访问到nginx,然后nginx再去请求tomcat,将内容返回给浏览器。
由于nginx对外需要https访问,而nginx访问tomcat的时候是使用http,可能会造成在浏览器加载静态文件的时候可能还是http协议,造成无法加载。

  1. nginx配置如下:
server {
        listen       443 ssl;
        server_name  b.itapes.cn;

        root html;
        index index.html index.htm;

        ssl_certificate      cert/2578177_b.itapes.cn.pem;
        ssl_certificate_key  cert/2578177_b.itapes.cn.key;

        #ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        #ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers  on;
        
        location / {
            proxy_set_header Host $host:$server_port;
            proxy_pass http://127.0.0.1:8443;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #$scheme是将访问的协议传递给tomcat
            proxy_set_header X-Forwarded-Proto $scheme;
        }

以上配置主要是proxy_set_header X-Forwarded-Proto $scheme;,这样的话在tomcat中运行的项目可以通过request来获取到当前使用的协议
proxy_pass http://127.0.0.1:8443;127.0.0.1为tomcat所在服务器的ip,8443为tomcat的http端口

  1. tomcat配置
    主要在server.xml中进行配置,选取部分内容如下:
<Engine name="Catalina" defaultHost="localhost">
  <Valve className="org.apache.catalina.valves.RemoteIpValve"
        internalProxies="127\.0\.0\.1"
        remoteIpHeader="x-forwarded-for"
        remoteIpProxiesHeader="x-forwarded-by"
        protocolHeader="x-forwarded-proto"
        protocolHeaderHttpsValue="https"
        httpsServerPort="443"
      />
</Engine>

以上配置中Value为主要内容,需要添加在Engine节点下,
internalProxies为nginx所在服务器的ip
httpsServerPort为nginx对外https的端口

根据之前项目部署过程中,使用以上配置即可解决出现的问题

### 如何配置 NginxHTTPS 请求转发到本地 HTTP 服务 为了实现将 HTTPS 请求通过 Nginx 转发至本地运行的 HTTP 服务,需要完成以下几个方面的配置: #### 1. 启用 SSL/TLS 支持并设置证书 Nginx 需要加载 SSL/TLS 证书来处理 HTTPS 流量。以下是基本的 SSL 配置示例: ```nginx server { listen 443 ssl; server_name example.com; # 加载SSL证书和私钥 ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; # 提高安全性的一些可选配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; } ``` 此部分配置用于启用 HTTPS,并指定服务器使用的 SSL 证书路径以及密钥位置[^2]。 --- #### 2. 定义 Location 块匹配请求路径 Location 块定义了如何匹配客户端请求的具体 URL 路径模式。可以使用正则表达式或者前缀匹配的方式。例如: - 使用 `location` 匹配 `/api/` 下的所有请求并将它们反向代理到本地的服务端口上。 ```nginx location /api/ { proxy_pass http://127.0.0.1:8080/; 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_http_version 1.1; proxy_set_header Connection ""; } ``` 上述代码片段展示了如何将 `/api/` 开头的请求转发给监听在 `127.0.0.1:8080` 的本地服务[^3]。 对于其他特定路径(如 `/user`, `/order`),也可以按照类似的逻辑进行扩展。 --- #### 3. 处理重定向场景 如果某些路径需要执行跳转操作,则可以通过 `return` 或者 `rewrite` 实现。例如,当访问 `/product` 时直接返回 Tomcat 应用程序主页链接: ```nginx location ~* /product { return 301 http://example.com/product/index.jsp; } ``` 此处利用了 `return` 指令完成了简单的页面重定向功能。 --- #### 4. 综合完整的 Server 配置实例 下面提供了一个综合性的例子,展示如何在一个虚拟主机下同时支持多个子目录的不同后端服务: ```nginx server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Connection ""; } location /files/ { alias /var/www/files/; } location /redirect-me { return 301 https://another-domain.com/target-page; } } ``` 以上完整配置涵盖了从 HTTPS 到内部 HTTP 微服务之间的桥接过程[^1]。 --- ### 注意事项 - **性能优化**:考虑开启缓存机制减少重复计算开销;调整 worker_processes 和 keepalive_timeout 参数提升并发能力。 - **日志记录**:合理规划 access_log 和 error_log 文件存储位置以便后续排查问题方便快捷。 - **安全加固**:除了基础加密外还需防范常见攻击手段比如 XSS, CSRF 等漏洞风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值