跳到主要内容

在nginx中实现HTTP跳转HTTPS配置记录

· 阅读需 3 分钟
JovenKing

在nginx中实现HTTP跳转HTTPS分两种情况,一种是常用的http端口(80)跳转到https端口(443),另外一种是同一个端口如果没有显式指定https协议访问的话则自动实现跳转到https网站,而不是显示下面这种错误

400 Bad Request
The plain HTTP request was sent to HTTPS port
nginx/1.18.0 (Ubuntu)

80端口跳转到443端口

server {
listen 443 ssl http2;
server_name _;
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/private.key;

location / {
add_header Content-Type 'text/plain; charset=utf-8';
return 200 '200 OK';
}
}

server {
listen 80;
server_name _;
rewrite ^(.*)$ https://$host$1 permanent;
}

相同端口跳转

server {
listen 81 ssl http2;
server_name _;
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/private.key;

# 重定向到https
error_page 497 301 =308 https://$host:$server_port$request_uri;

location / {
add_header Content-Type 'text/plain; charset=utf-8';
return 200 '200 OK';
}
}

扩展衍生

HTTP STATUS 497

HTTP响应状态代码497是一个特定于nginx的非官方客户端错误,由服务器返回,表示已向HTTPS端口发送了常规HTTP请求。

error_page指令

error_page指令是当nginx发生内部错误时,比如说404、403、500等错误,默认会跳转到nginx自带的错误页面。但是使用error_page指令可以修改默认错误页面,并且可以指定跳转的url或者文件路径。

  • error_page 497 https://$host$request_uri; 当服务器端遇到497错误时默认用302临时重定向到指定url
  • error_page 497 =301 https://$host$request_uri; 301永久重定向
  • error_page 497 =307 https://$host$request_uri; 307临时重定向,不改变请求的方法(如post还是post)

307和308状态码

  • 301:永久重定向,也就是说请求资源的URL被永久的更改了,新的URL在响应中给出;
  • 302:临时重定向,请求资源的URL临时被更改了,URL中的进一步更改可能在将来进行,因此客户机在以后的请求中应该使用这个URL;
  • 307:临时重定向,这与302 Found HTTP响应代码具有相同的语义;
  • 308:永久重定向,请求的资源永久的位于另外一个URL,新的URL由Location: HTTP Response头指定;

301或302重定向时,可能会改Post为Get,而307或308则不会