主要解决的场景:
- 配置域名https。
- 代理后参数继续传递。
-
开启GZIP压缩。
-
设备通过访问域名到pc或者H5的工程
-
通过访问/detail代理到PC端和H5端对应页面
-
nginx实现&&的方式及打印参数
# 以下属性中以ssl开头的属性代表与证书配置有关,其他属性请根据自己的需要进行配置。
server {
listen 443 ssl; #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。
server_name xxx.com; #将localhost修改为您证书绑定的域名,例如:www.example.com。
root html;
index index.html index.htm;
ssl_certificate cert/xxx.com.pem; #将domain name.pem替换成您证书的文件名。
ssl_certificate_key cert/xxx.com.key; #将domain name.key替换成您证书的密钥文件名。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
# 通过代理之后域名,ip是也传递过去
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
#开启GZIP压缩
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;
# 事例:设备通过访问域名到pc或者H5的工程
location / {
# 手机访问到H5的工程
if ($http_user_agent ~* "(mobile|Mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)") {
root /h5;
}
# PC访问到pc的工程
if ($http_user_agent !~* "(mobile|Mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)") {
root /pc;
}
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
}
# 事例:通过访问/detail代理到PC端和H5端对应页面
location ~* /detail {
# 获取后面传的的参数。如id=xx
if ($args ~* ".*(?:^|\?|&)id=(.+?)(?:(?:&.*)|$)") {
set $id $1;
}
# 是否PC
if ($http_user_agent !~* "(mobile|Mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)") {
set $isPCDetail "PC";
}
if ($http_user_agent ~* "(mobile|Mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)") {
set $isH5Detail "H5";
}
if ($isPCDetail = "PC") {
rewrite ^/(.*)$ https://xxx.com/#/productDetail?productId=${id} redirect;
}
if ($isH5Detail = "H5") {
# id=xx会直接拼接在最后面
rewrite ^/(.*)$ https://xxx.com/pages/productDetail/index redirect;
}
}
# 事例:nginx实现&&的方式及打印参数
location ^~ /api {
# 获取参数。如id=xx
if ($args ~* ".*(?:^|\?|&)id=(.+?)(?:(?:&.*)|$)") {
set $id $1;
}
# 是否匹配这个接口访问并设置值
if ($uri = "/api/getPcDetail"){
set $isPCDetail "1";
set $isH5Detail "0";
}
if ($uri = "/api/getH5Detail"){
set $isPCDetail "0";
set $isH5Detail "1";
}
# 是否PC
if ($http_user_agent !~* "(mobile|Mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)") {
# 通过拼接参数实现&&
set $isPCDetail "${isPCDetail}PC";
}
if ($http_user_agent ~* "(mobile|Mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)") {
# 通过拼接参数实现&&
set $isH5Detail "${isH5Detail}H5";
}
# &&的效果
if ($isPCDetail = "1PC") {
# 打印参数。(注意只有最后一个if的参数才会输出,在if里面定义的参数可以在其他if里面使用,if不能嵌套使用)
add_header X-id "$id";
add_header X-isPCDetail "$isPCDetail";
add_header X-isH5Detail "$isH5Detail";
}
proxy_pass http://127.0.0.1:8008;
}
}