正常情况下,使用HTTPS时,都会使用301、302状态码将80端口的HTTP服务重定向到位于443端口的HTTPS上,但是如果使用非标准端口时,由于需要输入端口号,若直接不带HTTPS前缀访问的话,此时会出现如下界面。
此时只有主动把地址栏中的http://更改为https://才能正常访问。
但是其实这个问题是可以解决的,可以利用497的错误页面。
497 – normal request was sent to HTTPS
当网站只允许https访问时,当用http访问时nginx会报出497错误码(不过实测NGINX返回的状态码是400,但并不影响使用497的error_page)
根据这个思路,那么如果指定error_page为对应的https页面,不就可以实现跳转了吗。在nginx的server块中加入如下配置。
error_page 497 https://$host:$server_port$request_uri;
修改后保存配置文件并重载或重启NGINX。
此时使用http方式去访问,发现已经成功重定向到https页面上了。
使用curl方式测试,发现nginx返回的是302状态码,即临时重定向。
这个办法不支持301重定向,不过301和302的区别只在于浏览器是否缓存,配合HSTS的话对使用影响不大。
顺便记录一下NGINX使用301和302重定向的两种办法
301
#rewrite法
rewrite ^(.*)$ https://$host$1 permanent;
#return法
return 301 https://$server_name$request_uri;
302
#rewrite法
rewrite ^(.*)$ https://$host$1 redirect;
#return法
return 302 https://$server_name$request_uri;