nginx 配置https 并兼容http 或强制http 转为https

本文介绍如何使用Nginx配置HTTPS服务,并确保与HTTP的兼容性。包括两种策略:一是允许HTTP和HTTPS同时访问;二是将HTTP请求重定向至HTTPS。详细展示了Nginx配置代码和关键SSL参数。

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

nginx 配置https 并兼容http 或强制http 转为https

原创katios 最后发布于2017-06-21 18:02:31 阅读数 22356 收藏
展开
当我们升级http 为https时,为了兼顾一些访问者还是通过http访问的方式,我们通常采用两种方式。

第一种:http 可以访问,https也可以访问。
第二种:http 访问时,重定向到https。

这里说下第一种方式。

server {
    listen       80;
    listen       443 ssl;
    server_name  xxxx.com;
    charset      urf-8;
    #ssl         on; #保持关闭,或者注释
    ssl_certificate /etc/nginx/conf.d/xxxx.crt;
    ssl_certificate_key /etc/nginx/conf.d/xxxx.key;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    root         /usr/share/nginx/html;

}   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
一些ssl配置,通常CA证书参加会给出相应的参数,例如遵循的是什么ssl_protocols 等。

不少教程上开启了ssl on 这个配置项,这会导致无法使用http 访问。

所以保证这个被注释掉。

这样通过http访问的请求才能够正确抵达

第二种方法。

server {
    listen 80;
    server_name  www.xxx.com;
    #告诉浏览器有效期内只准用 https 访问
    add_header Strict-Transport-Security max-age=15768000;
    #永久重定向到 https 站点
    return 301 https://$server_name$request_uri;
}

1
2
3
4
5
6
7
8
9
当访问80端口的http 请求就会被重定向到 https

这里要注意的是 $server_name 就是你的 www.xxx.com
$request_uri 就是请求的资源地址。
————————————————
版权声明:本文为CSDN博主「katios」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_21302587/article/details/73551583

<think>我们正在处理一个关于HTTP重定向到HTTPS的问题,特别是POST请求在重定向后变成了GET请求的问题。根据用户提供的引用,我们可以总结出以下几点:1.引用[1]和[2]指出,当HTTP的POST请求被重定向到HTTPS时,请求方法会变成GET,导致后台报错(如GET方法不支持)。 2.引用[3]提到在SpringMVC中,重定向时从HTTPS变成了HTTP的问题,给出了一个解决方案(设置`redirectHttp10Compatible`为false)。 3.引用[4]和[5]讨论了Nginx配置中重定向时端口丢失的问题以及如何正确配置HTTPHTTPS的重定向。 用户的问题:为什么HTTP请求会被自动重定向到HTTPS?如何解决?###为什么HTTP请求会被自动重定向到HTTPS?这通常是由于服务器配置强制重定向。例如,在Web服务器(如Nginx、Apache)应用服务器(如Tomcat)中配置了将所有HTTP请求重定向到HTTPS。这种重定向是为了保证安全性,确保用户使用加密连接。 ###为什么POST请求重定向后会变成GET? 根据HTTP/1.1规范(RFC2616),当服务器返回301(永久重定向)302(临时重定向)状态码时,客户端(如浏览器)在重定向时应该使用相同的请求方法和请求体。但是,在实际实现中,许多浏览器在遇到301302重定向时,会将POST请求改为GET请求,且不会携带原始的请求体。这是因为历史原因,早期的浏览器实现就是如此。HTTP/1.1引入了307(临时重定向)和308(永久重定向)状态码,这两个状态码要求客户端在重定向时必须保持原始的请求方法和请求体。因此,如果服务器返回的是307308,那么POST请求在重定向后仍然是POST。###如何解决? 根据引用[2]和[5],我们可以通过配置服务器返回307308状态码来解决POST请求变成GET的问题。另外,引用[3]提供了在SpringMVC中解决重定向协议问题的配置。 ####1. Nginx配置Nginx中,我们可以这样配置:```nginxserver{listen80;server_name example.com;return307https://$server_name$request_uri;} ```使用307状态码,这样POST请求在重定向后仍然是POST。####2.SpringMVC配置在SpringMVC中,如果重定向时出现协议从HTTPS变回HTTP的问题,可以配置视图解析器关闭对HTTP/1.0的兼容:```xml<bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="viewClass" value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/WEB-INF/pages/" /><property name="suffix"value=".jsp"/><propertyname="redirectHttp10Compatible"value="false"/> </bean>``` 设置`redirectHttp10Compatible`为false,这样在重定向时会使用相对路径,避免协议和主机名被硬编码。####3.其他服务器配置对于其他服务器(如Apache、Tomcat),同样需要确保在重定向HTTPHTTPS时使用307308状态码,而不是301302。 ###总结-自动重定向到HTTPS是服务器配置的结果,目的是为了安全。- POST请求在301/302重定向时会变成GET,使用307/308可以保持请求方法不变。-在Nginx配置重定向时使用307状态码。-在SpringMVC中配置视图解析器以避免重定向时协议回退。§§相关问题§§1.307和308状态码与301、302有什么区别? 2.除了Nginx,如何在Apache服务器中配置HTTPHTTPS的重定向(保持POST方法)?3.在SpringBoot中如何配置重定向以保持HTTPS?</think>### 为什么HTTP请求会被自动重定向到HTTPSHTTP请求被自动重定向到HTTPS通常由以下原因引起: 1. **服务器强制重定向** 服务器(如Nginx/Apache)配置强制跳转规则(如301/302重定向),当检测到HTTP请求时自动转到HTTPS端口。例如: ```nginx server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; # 强制重定向 } ``` [^5] 2. **安全策略(HSTS)** 浏览器缓存了HSTS(HTTP Strict Transport Security)策略,要求所有连接必须使用HTTPS,自动将HTTP升级为HTTPS[^2]。 3. **应用层框架配置** 如SpringMVC的`redirectHttp10Compatible`参数未正确配置,可能导致重定向时协议降级方法变更[^3]。 --- ### 为什么POST请求会变成GET请求? 当HTTP POST请求被**301/302重定向**到HTTPS时: - **HTTP规范限制**:301/302重定向要求客户端使用GET方法(RFC 7231规定) - **请求体丢失**:重定向时请求体(如POST数据)不会被保留 - **浏览器行为**:主流浏览器(Chrome/Firefox)在重定向时自动将POST转为GET[^1][^2]。 > **示例**:用户发起`POST http://api.com/data` → 服务器返回`302 Location: https://api.com/data` → 浏览器改为`GET https://api.com/data`。 --- ### 解决方案 #### 1. 使用307/308状态码替代301/302(推荐) 307/308重定向会保留原始请求方法和请求体: ```nginx server { listen 80; server_name example.com; return 307 https://$server_name$request_uri; # 保持POST方法 } ``` [^5] #### 2. 修复框架配置(SpringMVC示例) 关闭HTTP/1.0兼容模式,避免协议降级: ```xml <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="redirectHttp10Compatible" value="false" /> </bean> ``` [^3] #### 3. 避免混合协议重定向 确保后端服务返回的URL始终为HTTPS: ```java // Spring Boot示例 public String redirect() { return "redirect:https://example.com/new-path"; // 显式指定HTTPS } ``` #### 4. 检查端口配置 重定向时丢失端口会导致协议回退,需显式指定端口: ```nginx return 307 https://$server_name:443$request_uri; ``` [^4] #### 5. 前端直接使用HTTPS 彻底避免重定向问题,前端应用直接发起HTTPS请求。 --- ### 关键验证点 1. 用`curl -v -X POST http://...`观察响应头中的`Location`和状态码 2. 检查服务器配置中是否包含`return 301``return 302` 3. 确认浏览器未缓存过期的HSTS策略(可通过`chrome://net-internals/#hsts`清除) > **注意**:307/308状态码需客户端和服务器同时支持,现代浏览器和主流服务器均兼容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值