Nginx 实践

主要解决的场景:

  1. 配置域名https。
  2. 代理后参数继续传递。
  3. 开启GZIP压缩。

  4. 设备通过访问域名到pc或者H5的工程

  5. 通过访问/detail代理到PC端和H5端对应页面

  6. 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;
        }
	} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值