在nginx中实现HTTP跳转HTTPS配置记录
· 阅读需 3 分钟
在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临时重定向到指定urlerror_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则不会