基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.com,但是很多用户不清楚https和http的区别,会很容易敲成http://test.com,这时会报出404错误,所以我需要做基于test.com域名的http向https的强制跳转
我总结了三种方式,跟大家共享一下
这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可
搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了
解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码
利用error_page命令将497状态码的链接重定向到https://test.com这个域名上
上述两种方法均会耗费服务器的资源,我们用curl访问baidu.com试一下,看百度的公司是如何实现baidu.com向www.baidu.com的跳转
可以看到百度很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com.因此我们可以基于http://test.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转
[html] view plaincopyprint?
物理机的访问的ip:221.221.1.100
对外开放的外网ip:200.200.19.53
nginx:10.30.30.109:8314
代理后台服务的ip:10.30.30.131:8080
server{
listen 8314;
server_name 200.200.19.53;
#server_name 10.30.30.109;
location /jettech {
proxy_pass http://10.30.30.131:8080;
proxy_pass_request_headers off;
proxy_cache_valid 200 206 304 301 302 10d;
proxy_cache_key $uri;
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;
proxy_set_header proxy_nginx_ip $host; #server_name of ip,200.200.19.53
proxy_set_header X-Real-IP_Client_Access $remote_addr; #access clint host or yourself of ip。用户访问的时候的自己电脑ip地址221.221.1.100
proxy_set_header X-Real-Port_Client_Access $remote_port; #access clint port。用户访问的时候的自己电脑端口,随机分配动态变化
proxy_set_header X-Real-User_Client_Access $remote_user ; #access clint user。客户的用户名
proxy_set_header X-Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #all access client ip 。从客户访问到到最后的后台服务所经理的所有节点的ip汇总221.221.1.100,10.30.30.109,...
proxy_set_header X-FORWARDED-HOST $server_addr; #nginx of ip 10.30.30.109
proxy_set_header proxy_nginx_hostname $hostname; # nginx of hostname,k8s-test-nginx-109
proxy_set_header X-FORWARDED-PORT $server_port; #nginix of port or nginx listen of port,8314
proxy_set_header X-FORWARDED-NAME $server_name; #serve_name of ip or $host
proxy_set_header X-FORWARDED-PROTO $server_protocol;
proxy_set_header X-NGINX_VER $nginx_version;
proxy_set_header Proxy_Host $proxy_host; #proxy_pass of ip or houtai server of ip ,要转发的地址10.30.30.131(proxy_pass http://10.30.30.131:8080;)
proxy_set_header Proxy_Port $proxy_port; #proxy_pass of port ou houtai server of port,要转发的端口8080(proxy_pass http://10.30.30.131:8080;)
proxy_http_version 1.1;
#开启对http1.1支持
proxy_set_header Connection "";
# 设置Connection为空串,以禁止传递头部到后端
# http1.0中默认值Connection: close
proxy_redirect off;
#proxy_pass http://10.30.30.131;
}
}
nginx 内置变量使用说明及具体意义
$args
参数: $args
解释: HTTP请求中的完整参数。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "a=10"
1
2
3
4
$binary_remote_addr
参数: $binary_remote_addr
解释: 二进制格式的客户端地址。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "\xC0\xA8\x01\xC8"
1
2
3
4
$body_bytes_sent
参数: $body_bytes_sent
解释: 表示在客户端发送的http响应中,包体部分的字节数
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "264"
1
2
3
4
$content_length
参数: $content_length
解释: 表示客户端请求头部中的Content-Length
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "264"
1
2
3
4
$content_type
参数: $content_type
解释: 表示客户端请求头部中的Content-Type
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "text/html"
1
2
3
4
$document_root
参数: $document_root
解释: 返回nginx服务器中资源跟目录,这取决于在server{}中定义的root路径
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/usr/local/nginx/html"
1
2
3
4
$uri
参数: $uri
解释: 表示当前请求的URI,不带任何参数
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/192.168.1.200"
1
2
3
4
$document_uri
参数: $document_uri
解释: 与$uri含义相同
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/192.168.1.200"
1
2
3
4
$request_uri
参数: $request_uri
解释: 表示客户端发来的原始URL,带完整的参数,$request_uri永远不会变,始终是用户的原始URL
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/192.168.1.200?a=10"
1
2
3
4
$host
参数: $host
解释: 表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server name名称代替。如果Host字段中带有端口,如IP:PORT,那么$host会去掉端口
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "test.wanglei.com"
1
2
3
4
$hostname
参数: $hostname
解释: 表示Nginx所在的机器的名称,与gethostbyname调用返回的值相同
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "centos7-201"
1
2
3
4
$is_args
参数: $is_args
解释: 表示请求中的URL是否带参数,如果带参数,$is_args值为"?"。如果不带参数,则是空字符串
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "?"
访问: curl http://test.wanglei.com/192.168.1.200 -I
返回: ""
1
2
3
4
5
6
$limit_rate
参数: $limit_rate
解释: 表示当前限制速率是多少, 0表示无限速
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "51200"
配置: limit_rate 50k;
1
2
3
4
5
$nginx_version
参数: $nginx_version
解释: 表示当前nginx的版本号
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "1.8.1"
1
2
3
4
$query_string
参数: $query_string
解释: 请求URI中的参数,与$args相同,然而$query_string是只读的不会变得
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "a=10"
1
2
3
4
$remote_addr
参数: $remote_addr
解释: 表示客户端的地址
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "192.168.1.200"
1
2
3
4
$remote_port
参数: $remote_port
解释: 表示客户端连接使用的端口,这个是随机的,每个人都不一样
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "50451"
1
2
3
4
$remote_user
参数: $remote_user
解释: 表示使用Auth Basic Module时定义的用户名
访问: curl -u wanglei:wanglei123 http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "wanglei"
1
2
3
4
$request_filename
参数: $request_filename
解释: 表示用户请求中的URI经过root或alias转换后的文件路径,默认是index.html
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/usr/local/nginx/html/192.168.1.200"
1
2
3
4
$request_completion
参数: $request_completion
解释: 当请求已经全部完成时,其值为"OK"。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用HTTP range访问的并不是文件的最后一块,那么其值也是空字符串
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "OK"
1
2
3
4
$request_method
参数: $request_method
解释: 表示HTTP请求的方法名,如GET/POST/PUT等
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "HEAD"
访问: curl http://test.wanglei.com/192.168.1.200 -d "x=1" -I
返回: "POST"
1
2
3
4
5
6
$scheme
参数: $scheme
解释: 表示HTTP scheme,如在请求https中表示https,http中表示http
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "http"
1
2
3
4
$server_addr
参数: $server_addr
解释: 表示服务器地址
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "192.168.1.200"
1
2
3
4
$server_name
参数: $server_name
解释: 表示服务器名称
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "test.wanglei.com"
1
2
3
4
$server_port
参数: $server_port
解释: 表示服务器端口
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "80"
1
2
3
4
$server_protocol
参数: $server_protocol
解释: 表示服务器向客户端发送响应的协议,如HTTP/1.1或HTTP/1.0
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "HTTP/1.1"
1
2
3
4
$time_local
参数: $time_local
解释: 表示服务器当前的本地时间
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "25/Mar/2017:22:10:51 +0800"
1
2
3
4
$request
参数: $request
解释: 返回客户端请求的头部信息
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "HEAD /192.168.1.200?a=10 HTTP/1.1"
1
2
3
4
$status
参数: $status
解释: 表示客户端请求服务器的HTTP返回码
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "302"
1
2
3
4
$http_user_agent
参数: $http_user_agent
解释: 浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)和用户个人偏好的代码
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "curl/7.29.0"
1
2
3
4
$request_time
参数: $request_time
解释: 返回从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "0.000"
1
2
3
4
$response_time
参数: $response_time
解释: 返回从Nginx向后端(upstream)建立连接开始到接受完数据然后关闭连接为止的时间。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "0.000"