nginx强制使用https访问的多种方法(http跳转到https)

标签: Nginx https nginx rewrite | 发表时间:2023-03-15 13:12 | 作者:C1G
出处:http://blog.c1gstudio.com

nginx强制使用https访问的多种方法(http跳转到https)

先说明一下HTTP跳转的状态码

301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址。这意味着,如果原始请求是 POST 请求,那么 301 重定向会将其转变为 GET 请求。此外,浏览器会缓存 301 响应,下一次请求时会直接跳转到 HTTPS 上。

302 Found / 303 See Other:这两种方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上。302 Found 的响应会将请求方法保持不变,同时将请求地址修改为重定向后的地址。而 303 See Other 则会将所有请求方法转变为 GET 方法,并将请求地址修改为重定向后的地址。这两种方式都不会缓存响应,下一次请求时会再次发起请求。

307 Temporary Redirect:该方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上,并且会保留原始的请求方法。这意味着,如果原始请求是 POST 请求,那么重定向后的请求仍然是 POST 请求。同时,请求地址也会被修改为重定向后的地址。与 302 Found 类似,307 Temporary Redirect 不会缓存响应,下一次请求时会再次发起请求。

308 Permanent Redirect:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 308 响应后,会自动将 HTTP 请求转为与原始请求方法相同的请求方法,同时将请求地址修改为重定向后的地址。与 301 Moved Permanently 不同的是,308 Permanent Redirect 不会允许浏览器将 POST 请求重定向到新地址。308 响应也会被缓存,下一次请求时会直接跳转到 HTTPS 上。

497 normal request was sent to HTTPS:(HTTP到HTTPS(Nginx))Nginx内置的代码,被用于原始的HTTP的请求发送给HTTPS端口去分辨4XX在日志中和一个错误页面的重定向

推荐使用return 307 跳转码,百度、亚马逊等也是使用307跳转。

方式一:
返回 301 错误,并跳转到 https 地址

  
server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        set $sslflag 0;
        if ($ssl_protocol = '') {
            set $sslflag "${sslflag}1";
        }
        if ($sslflag = "01") {
            return 301 https://$server_name$request_uri;
        }
}

方式二:
当 nginx 配置的站点只允许 https 访问时,我们却使用 http 去访问,此时 nginx 会报出 497 错误码。
我们就可以利用 error_page 命令将 497 状态码的链接重定向到 https

  
server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        error_page 497 https://$server_name$request_uri;
}

方式三:
使用参数标记,只跳转一次https。
将 http 请求重写到 https 地址,并带上?https=Y参数.
PURGE方式不进行跳转

  
server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        set $sslflag 0;
        if ($server_port = 80) {
            set $sslflag "${sslflag}1";
        }
        if ( $request_method = "PURGE") {
            set $sslflag "${sslflag}2";
        }
        if ($arg_sslsign ) {
            set $sslflag "${sslflag}4";
        }
        set $ssljumpparam "?https=Y";
        if ($is_args = '?'){
            set $ssljumpparam "&https=Y";
        }
        if ($sslflag = "01") {
            rewrite ^(.*)$ https://$host$uri$is_args$query_string$ssljumpparam? redirect;
        }  
}

方式四:
当post数据到http协议时,重定向后会出现请求方法变为 get,post数据丢失。
解决这个问题就要换返回的状态码,307是临时,308是永久.

  
server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        set $sslflag 0;
        if ($scheme = http) {
            set $sslflag "${sslflag}1";
        }
        if ($request_method = POST) {
            set $sslflag "${sslflag}2";
        }

        if ($sslflag = "012") {
        return 307 https://$host$request_uri;
        }  
        if ($sslflag = "01") {
        return 301 https://$host$request_uri;
        }
}

方式五:
所有http 的GET请求301跳转至https,
POST等请求的用proxy_pass来接收并反代https

  
server{
        listen 80;
        server_name  blog.c1gstudio.com;

        set $sslflag 0;
        if ($ssl_protocol = '') {
          set $sslflag "${sslflag}1";
        }
        if ( $request_method = "GET") {
            set $sslflag "${sslflag}2";
        }
        if ($sslflag = "012") {
          return 301 https://$server_name$request_uri;
        }

        location / {
            proxy_set_header Host  $host;
            proxy_set_header X-Pass my_proxy;
            proxy_pass https://127.0.0.1;
        }

}

The post nginx强制使用https访问的多种方法(http跳转到https) first appeared on C1G军火库.

相关 [nginx https 访问] 推荐:

nginx强制使用https访问的多种方法(http跳转到https)

- - C1G军火库
nginx强制使用https访问的多种方法(http跳转到https). 先说明一下HTTP跳转的状态码. 301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的. 客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址.

Nginx 安装 HTTPS 证书

- - idea's blog
基本步骤可以参考 这篇文章, 但这篇文章有一个致命错误, 就是没有安装 INTERMEDIATE CA, 照样会被浏览器显示证书不可信.. 生成 server.key.orig. 生成 server.csr 和 server.key. 拿着 server.csr 去证书厂商买证书. 买完后, 厂商会给你发两个证书 server.crt 和 server.intermediate.crt.

certbot在Centos7上配置合法签名证书,实现nginx的https访问-咖啡猫Mr-51CTO博客

- -
  公司因之前使用的openssh创建的自签名证书,有一个弊端,就是在某些客户端上不能使用此证书,无法使用https连接,所以,研究了一下certbot 做签名证书. 你需要有一个公网地址,并绑定合法域名. (1)、下载Certbot客户端:. (2)、下载后,进入下载的目录,添加执行权限. 3、介绍一下certbot的两种工作方式:.

nginx 配置 https 的双向认证

- - 操作系统 - ITeye博客
SSL 的双向认证就是,客户端要获取服务端的证书,检查下服务端是不是我可以信任的主机,否则我就认为那个站点的内容不可信任,不应该去访问你(浏览器会告诉你),同时服务端也要检查客户端的证书,客户端如果不是服务端所信任的,那服务端也会认为,你不是我的合法用户,我拒绝给你提供服务. 所以,要让 HTTPS 的双向认证顺利完成,就要在服务端给定一个证书,这个证书是浏览器可信任的,同时客户端(浏览器)也要发送给服务端一个证书,服务器端也要信任这个证书.

Nginx并发访问优化

- - CSDN博客推荐文章
    Nginx反向代理并发能力的强弱,直接影响到系统的稳定性. 安装Nginx过程,默认配置并不涉及到过多的并发参数,作为产品运行,不得不考虑这些因素. Nginx作为产品运行,官方建议部署到Linux64位系统,基于该建议,本文中从系统线之上考虑Nginx的并发优化.     1、打开Linux系统epoll支持.

基于 Nginx 的 HTTPS 性能优化实践

- - 编程学习网
分享一个HTTPS优化案例(文章稍长. 随着相关浏览器对HTTP协议的“不安全”、红色页面警告等严格措施的出台,以及向 iOS 应用的 ATS 要求和微信、支付宝小程序强制 HTTPS 需求,以及在合规方面如等级保护对传输安全性的要求都在推动 HTTPS 的发展. 虽然 HTTPS 优化了网站访问体验(防劫持)以及让传输更加安全,但是很多网站主赶鸭子上架式的使用了 HTTPS 后往往都会遇到诸如:页面加载速度变慢、服务器负载过高以及证书过期不及时更新等问题.

Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持

- -
之前在网上搜索到的很多文章在描述. Nginx + Tomcat启用 HTTPS 支持的时候,都必须在 Nginx 和 Tomcat 两边同时配置 SSL 支持. 但我一直在想为什么就不能按照下面的方式来配置呢. 就是 Nginx 上启用了 HTTPS,而 Nginx 和 Tomcat 之间走的却是普通的 HTTP 连接.

让Apache 和nginx支持跨域访问

- - ITeye博客
1,如何让Apache支持跨域访问呢? . 修改httpd.conf,windows中对应的目录是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf. 把LoadModule headers_module modules/mod_headers.so 前面的注释删除.

强制Chrome浏览器Https加密访问网站

- HENG - 启光博客
  强制Chrome浏览器加密访问网站其实也就是强制Chrome浏览器http重定向到https,这种技巧对于经常修改Hosts的网友可能用处较大些. 比如修改Hosts后访问Twitter,多数情况下访问http://www.twitter.com是不能访问的,要输入https://twitter.com才行.

维基百科启用 HTTPS 访问支持

- 万俟尘 - #ifanrlive
维基百科(Wikipedia)发布博文称已启用原生 HTTPS 访问支持. “这允许您访问我们的网站,而不必跟踪您的浏览习惯;您可以无需担心您的密码或用户会话数据被盗而直接登录访问. ”维基百科的运营工程师 Ryan Lane 在博文里这样写道. 维基百科公布了 HTTPS 的具体配置,并强调相比此前的安全网址“HTTPS 能够带来更安全的浏览”.