linux CentOS安装php7.4 ZipArchive扩展和libzip扩展

这里我们已centos7为例子,Ubuntu系统的同学,可以对比下对应的命令

首先执行php -m 查看自己已安装的扩展包,避免重复安装

安装这两个扩展包的先决条件:

1.安装zip,需要先安装libzip扩展
2.安装libzip,需要先安装cmake

SO,我们先安装cmake

1.由于安装cmake十分缓慢,建议科学上网,不具备条件的同学,这里,我已经下载好了,需要的同学自取 
有条件的同学可以直接服务器下载 
wget https://cmake.org/files/v3.3/cmake-3.3.2.tar.gz 
对应的版本可以自己去查看
2.tar xzvf cmake-3.3.2.tar.gz 解压源码包
3.安装gcc等程序包(安装过则忽略) yum install gcc-c++
4.安装cmake,先进入解压后的cmake目录,cd cmake-3.3.2, ./bootstrap
5.编译安装make && make install
6.查看版本:cmake --version,出现版本信息表示安装成功
#####第二步,安装libzip,由于cmake的限制,libzip版本必须>=0.11,具体可看官方:https://nih.at/libzip/index.html

1.#下载
wget https://nih.at/libzip/libzip-1.2.0.tar.gz 
#需要高版本的同学可以去https://nih.at/libzip自己寻找
2.#解压
tar -zxvf libzip-1.2.0.tar.gz
#进入目录
cd libzip-1.2.0
3.#配置编译安装
./configure,make && make install
第三步,安装zip

1.#下载
wget http://pecl.php.net/get/zip-1.16.0.tgz,#需要高版本的到官网查询[http://pecl.php.net/package/zip](http://pecl.php.net/package/zip)
2.#解压并进入目录
tar zxvf zip-1.16.0.tgz,cd zip-1.16.0
3.#编译安装/
usr/local/php/bin/phpize,
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
4.#修改php.ini,加上扩展
[zip] extension=zip.so,zlib.output_compression = On,
5.重启PHP,查看phpinfo,zip扩展已经安装成功

system libzip must be upgraded to version >= 0.11

首先,卸载系统自带的libzip

yum  -y remove libzip-devel

然后从官网下载并编译安装

wget https://libzip.org/download/libzip-1.3.2.tar.gz
tar xvf libzip-1.3.2.tar.gz
cd libzip-1.3.2
./configure
make && make install

如果是下载1.5.*以上版本,则需要采用如下安装方式

yum -y install cmake
wget https://libzip.org/download/libzip-1.5.1.tar.gz
tar -zxvf libzip-1.5.1.tar.gz
cd libzip-1.5.1
mkdir build
cd build
cmake ..
make && make install
然后再安装zip

CentOS 7 修复官方源/更换阿里云yum镜像源

发现即使在国外节点的服务器,阿里云的centos镜像源速度仍然是不讲道理的下载速度,对比原来的centos官方的源的速度,快N倍。
果断换掉破自行车,换飞机。
删除centos官方源前,请确保已经安装了wget命令,如果已经删源了还没安装wget,可以先恢复官方源,安装wget再删除官方源。

  • 恢复官方源:rpm -Uvh –force http://mirror.centos.org/centos-7/7/os/x86_64/Packages/centos-release-7-9.2009.0.el7.centos.x86_64.rpm 备注:由于rpm包跟着最新版更新,具体以官网现有的rpm包名字的链接为准,我现在的时间最新版为7.7.1908,如果安装官方报错,可以自行到源站查看最新版包名,把url中的centos-release-7-7.1908.0.el7.centos.x86_64.rpm相应版本号改成你在官网看到的版本号即可
  • 安装wget
    yum install -y wget
    安装wget之后,就可以把centos官方源换成阿里的。
  1. 清除yum缓存yum clean all
  2. 删除官方源cd /etc/yum.repos.d && rm -rf ./*
  3. 添加阿里云的镜像源和EPEL源
  4. 重新生成缓存yum makecache & yum makecache fast
  5. 更新软件包,系统yum update -y
  6. 享受阿里云遍布全球的CDN加速节点

域名停用后未注销ICP备案引发的法律风险之化解 |李章虎律师团队

风险背景

随着网络安全形势日益严峻,国家监管政策亦日趋严格。如今各企业单位申请域名开办网站之前,须依照《互联网信息服务管理办法》的规定,以企业或个人真实信息向当地通信管理局进行ICP域名备案。不少企业使用一段时间后停办网站且不再向域名经销商缴纳域名使用费,以为该域名从此即与己无关。但他们却忽视了重要法律风险——若未向通信管理局申请注销附在域名ICP备案信息,导致域名所有权变更为他人,但备案信息还是自己的对外状态,而在后续的域名流转过程中,该域名极有可能被他人购得而非法利用,从而为企业招致较大的法律风险。

在北京知识产权法院审结的(2021)京73民终1171号北京某公司诉北京某知识产权代理有限公司侵害作品信息网络传播权纠纷民事一案中,被告北京某知识产权代理有限公司正是由于域名到期停用后未及时注销ICP备案登记,导致后续域名流转至案外人王某时备案主体仍显示为被告北京某知识产权代理有限公司。在此种情形下,涉案域名网站被“改造”成某电影网,免费提供各类电影在线播放及下载服务。权利人以该网站的ICP备案主体为被告诉至法院,法院最终认定被告北京某知识产权代理有限公司侵权成立,令其赔偿原告北京某公司20000余元。除此案外,该案被告北京某知识产权代理有限公司同时遭遇其他权利人发起的多起类似诉讼,均被法院判赔数万元,并承担了诉讼费及相关支出,付出了巨大的时间和精力,累计损失不可谓不大。

那么,应当如何化解企业在域名停用后未注销ICP备案引发的法律风险呢?

近日,上海锦天城(重庆)律师事务所合伙人李章虎律师团队办理的一起北京某公司诉重庆某公司侵犯作品信息网络传播权纠纷案在重庆两江新区人民法院开庭审理,本案中李章虎律师团队代理被告重庆某公司参与案件诉讼,该案的应诉策略及诉讼思路对于企业预防此类法律风险,以及律师同仁代理此类案件时的诉讼策略选择具有十分典型的参考意义。

案情简介

原告北京某公司称其从著作权人处以独占许可的方式获得了涉案数部作品的信息网络传播权及维权权利,在授权有效期间内发现某网站正在提供涉案作品的在线播放服务,而该网站的ICP备案主体正是被告。因此,原告认为被告侵犯了其作品的信息网络传播权,故提起本次诉讼,要求被告停止侵权,赔偿经济损失及合理维权费用共计十六万元。

承办过程

本案被告重庆某公司委托上海锦天城(重庆)律师事务所合伙人李章虎律师、王艳实习律师、高宇律师助理组成律师团队参与案件诉讼。律师团队接受本次代理后,第一时间制定了诉讼策略,并协助当事人应对本次诉讼。

一般而言,作品信息网络传播权纠纷案件中被告拥有多个抗辩点,包括原被告主体不适格抗辩、无作品权利基础抗辩、不侵权抗辩以及合法来源抗辩等。在本案中,被告先前使用的涉案域名因到期后未再续费,实际上已失去对域名的管理权,但由于涉案域名ICP备案信息未申请注销,工信部查询系统显示的域名管理人仍为被告。经调查了解,确认被告确实无实施侵犯原告作品信息网络传播权的行为后,律师团队从尊重案件事实、维护当事人合法权益的角度出发,确定以“被告非案件适格主体”进行抗辩,并及时协助当事人采取以下措施:

1、 立即向当地通信管理局申请注销ICP备案;

2、 立即在当地的公安局报案,获取书面报案回执,进行自救性备案;

3、 通过Whois系统查询涉案域名的管理商,并向涉案域名管理商发函询问,核实域名情况,并敦促其尽快关停涉案网站并披露侵权期间域名的实际使用人信息;

4、 请求人民法院从涉案域名管理商处调取相关证据以明确实际侵权人。

通过采取上述取证、固证措施,律师团队在明确涉案域名销售管理商信息后积极与其联系,并努力说服且提请法院向域名销售管理商调取涉案域名的流转、使用记录,从而获得足以确定本案实际侵权人的直接证据,排除了被告重庆某公司作为ICP备案主体的侵权可能。原告自觉其诉讼请求已丧失事实依据,遂撤诉结案。

李章虎律师团队基于该案件的处理结果认为:企业在处理类似问题引发的诉讼案件中,应当于案件初始阶段就从各种途径对案件证据进行补强,若决定从“非案件适格被告”的角度进行抗辩,则必须从多个方面调查证据、固定证据,以证明自己非实际侵权主体,且最好能够举证证明确实存在其他实际侵权人。

本案中,李章虎律师团队在查阅既往的司法判例后,深知许多被控侵权的被告正是由于未能举示充分证据证明实际侵权人的存在,而被法院判决承担赔偿责任。为应对这一诉讼风险,律师团队尽最大的努力搜集相关证据,最终证明了涉案域名到期后已发生两次转移,且侵权行为发生时涉案域名已由案外人控制的关键事实,同时结合被告掌握的其他证据,形成了一个完整的证据链条,得以证明本案被告并未实施任何侵权行为,并使得法官产生内心确信,取得了极好的诉讼效果。

庭审其他重点

虽然此类案件中确定的主要抗辩点为被告主体不适格,但除此之外,在庭审中亦不能忽视对原告权属、侵权事实等方面证据的核实。因此,被告仍应当注意以下重点:

1、 审查原告主张权利作品的原始载体、权属证据是否完备;

2、 审查原告主张权利作品权利授权链条是否完整,尤其注意作品授权书的内容是否存在矛盾之处;

3、在权利作品与侵权作品之间进行认真比对,审查二者是否构成相同或实质性相似;

4、审查核对原告提供的证据原件与复印件是否一致等;

案件启示

随着互联网经济的不断发展,此类案件近年来频频发生,许多企事业单位因此遭遇“无妄之灾”,大多败诉结案。为避免陷入诉累,企业应当注意以下几点:

1、 域名不使用后,若未注销ICP备案的,必须及时向备案机关申请注销ICP备案,从源头上消除诉讼风险;

2、若未注销备案而遭遇侵权诉讼后,应当及时采取相关措施维护自身权利,包括但不限于:(1)积极向当地公安局报案,说明事实情况,获取书面报案回执;(2)通过Whois系统查询涉案域名的管理商,并向涉案域名管理商发函询问,核实域名情况,并敦促其尽快关停涉案网站并披露侵权期间域名的实际使用人信息;(3)请求法院向涉案域名管理商处调取相关证据以明确实际侵权人。

CSS、JS、字体、图片静态文件nginx配置压缩指南

静态文件简介

Web 开发中需要的静态文件有:CSS、JS、字体、图片,可以通过web框架进行访问,但是效率不是最优的。
Nginx 对于处理静态文件的效率要远高于 Web 框架,因为可以使用 gzip 压缩协议,减小静态文件的体积加快静态文件的加载速度、开启缓存和超时时间减少请求静态文件次数。

下面就介绍如何通过 Nginx 管理静态文件的访问,优化网站的访问速度。

一、开启 gzip

配置介绍和参数如下,建议使用时删掉注释。

gzip on;
#该指令用于开启或关闭gzip模块(on/off)

gzip_buffers 16 8k;
#设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。16 8k代表以8k为单位,安装原始数据大小以8k为单位的16倍申请内存

gzip_comp_level 6;
#gzip压缩比,数值范围是1-9,1压缩比最小但处理速度最快,9压缩比最大但处理速度最慢

gzip_http_version 1.1;
#识别http的协议版本

gzip_min_length 256;
#设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。这里我设置了为256

gzip_proxied any;
#这里设置无论header头是怎么样,都是无条件启用压缩

gzip_vary on;
#在http header中添加Vary: Accept-Encoding ,给代理服务器用的

gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype font/ttf application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
#进行压缩的文件类型,这里特别添加了对字体的文件类型

gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#禁用IE 6 gzip

二、扩展压缩类型

修改 /etc/nginx/mime.types 文件,增加需要压缩的文件对应 type 到上述 gzip 配置中。下面几乎涵盖了所有静态文件对应的类型:

types {
    application/atom+xml                atom;
    application/dart                    dart;
    application/gzip                    gz;
    application/java-archive            jar war ear;
    application/javascript              js jsonp;
    application/json                    json;
    application/owl+xml                 owl owx;
    application/pdf                     pdf;
    application/postscript              ai eps ps;
    application/rdf+xml                 rdf;
    application/rss+xml                 rss;
    application/vnd.ms-fontobject       eot;
    application/x-7z-compressed         7z;
    application/x-bittorrent            torrent;
    application/x-chrome-extension      crx;
    application/x-font-otf              otf;
    application/x-font-ttf              ttc ttf;
    application/x-font-woff             woff;
    application/x-opera-extension       oex;
    application/x-rar-compressed        rar;
    application/x-shockwave-flash       swf;
    application/x-web-app-manifest+json webapp;
    application/x-x509-ca-cert          crt der pem;
    application/x-xpinstall             xpi;
    application/xhtml+xml               xhtml;
    application/xml                     xml;
    application/xml-dtd                 dtd;
    application/zip                     zip;

    audio/midi                          kar mid midi;
    audio/mp4                           aac f4a f4b m4a;
    audio/mpeg                          mp3;
    audio/ogg                           oga ogg;
    audio/vnd.wave                      wav;
    audio/x-flac                        flac;
    audio/x-realaudio                   ra;

    image/bmp                           bmp;
    image/gif                           gif;
    image/jpeg                          jpe jpeg jpg;
    image/png                           png;
    image/svg+xml                       svg svgz;
    image/tiff                          tif tiff;
    image/webp                          webp;
    image/x-icon                        cur ico;

    text/cache-manifest                 appcache manifest;
    text/css                            css less;
    text/csv                            csv;
    text/html                           htm html shtml;
    text/mathml                         mml;
    text/plain                          txt;
    text/rtf                            rtf;
    text/vcard                          vcf;
    text/vtt                            vtt;
    text/x-component                    htc;
    text/x-markdown                     md;

    video/3gpp                          3gp 3gpp;
    video/avi                           avi;
    video/mp4                           f4p f4v m4v mp4;
    video/mpeg                          mpeg mpg;
    video/ogg                           ogv;
    video/quicktime                     mov;
    video/webm                          webm;
    video/x-flv                         flv;
    video/x-matroska                    mkv;
    video/x-ms-wmv                      wmv;
}

三、开启超时时间

通过设置Expires,开启缓存。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
    expires 30d;
    access_log off;
}

location ~ .*\.(eot|ttf|otf|woff|svg)$ {
    expires 30d;
    access_log off;
}

location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
}

Nginx反爬虫: 限制可疑User Agent抓取网站

一、概述

网站反爬虫的原因

  • 不遵守规范的爬虫会影响网站的正常使用
  • 网站上的数据是公司的重要资产
  • 爬虫对网站的爬取会造成网站统计数据的污染

常见反爬虫手段

1. 根据 IP 访问频率封禁 IP

2. 设置账号登陆时长,账号访问过多封禁 设置账号的登录限制,只有登录才能展现内容 设置账号登录的时长,时间一到则自动退出

3. 弹出数字验证码和图片确认验证码 爬虫访问次数过多,弹出验证码要求输入

4. 对 API 接口的限制 每天限制一个登录账户后端 api 接口的调用次数 对后台 api 返回信息进行加密处理

二、nginx反爬设置

站点配置文件

因为user-agent带有Bytespider爬虫标记,这可以通过Nginx规则来限定流氓爬虫的访问,直接返回403错误。 修改对应站点配置文件(注意是在server里面)

添加红色部分

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  index index.html index.htm index.nginx-debian.html;

  server_name _;

  location / {
    try_files $uri $uri/ =404;
  }
  #forbidden Scrapy
  if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
    return 403;
  }

  #forbidden UA
  if ($http_user_agent ~ "Bytespider|FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|python-requests|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {

    return 403;
  }
  #forbidden not GET|HEAD|POST method access
  if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
  }
}

附录:UA收集

FeedDemon             内容采集
BOT/0.1 (BOT for JCE) sql注入
CrawlDaddy            sql注入
Java                  内容采集
Jullo                 内容采集
Feedly                内容采集
UniversalFeedParser   内容采集
ApacheBench           cc攻击器
Swiftbot              无用爬虫
YandexBot             无用爬虫
AhrefsBot             无用爬虫
YisouSpider           无用爬虫(已被UC神马搜索收购,此蜘蛛可以放开!)
jikeSpider            无用爬虫
MJ12bot               无用爬虫
ZmEu phpmyadmin       漏洞扫描
WinHttp               采集cc攻击
EasouSpider           无用爬虫
HttpClient            tcp攻击
Microsoft URL Control 扫描
YYSpider              无用爬虫
jaunty                wordpress爆破扫描器
oBot                  无用爬虫
Python-urllib         内容采集
Python-requests       内容采集
Indy Library          扫描
FlightDeckReports Bot 无用爬虫
Linguee Bot           无用爬虫
使用python验证

python验证

使用requests模块

import requests
# 最基本的不带参数的get请求
r = requests.get('http://192.168.28.229')
print(r.content)

使用urllib模块

import urllib.request
response = urllib.request.urlopen('http://192.168.28.229/')
print(response.read().decode('utf-8'))

返回403就表示起作用了。

b'<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body>\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'

三、整站防护设置

示意图

第一层

robots.txt

robots是网站跟爬虫间的协议,用简单直接的txt格式文本方式告诉对应的爬虫被允许的权限,也就是说robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。

注意:它只是做了协议规定,是否允许将爬取的数据收录,不影响网页访问。

备注:对于手动写爬虫技术人员而言,一般都是直接忽略掉的。

如果不允许所有的爬虫蜘蛛访问,内容如下:

User-agent: *
Disallow: /

第二层

useragent特征拦截

因为user-agent带有Bytespider爬虫标记,这可以通过Nginx规则来限定流氓爬虫的访问,直接返回403错误。

具体操作,请查看上面的nginx配置。

备注:这样可以防止一部分爬虫访问,以及初级爬虫人员。

第三层

JS发送鼠标点击事件

有些网站,你从浏览器可以打开正常的页面,而在requests里面却被要求输入验证码或者是重定向到其他的页面。 原理:当点击登录时,触发js加密代码,复杂的加密算法参数+时间戳+sig值,后台进行 参数+时间的限制。验证成功后,才可以登录。

备注:爬虫高手需要模拟浏览器行为,加载js代码以及图片识别,才能正常登陆。

第四层

后台接口限制

1. 根据 IP 访问频率封禁 IP(注意:频率要控制好,否则容易误伤。) 2. 设置账号登陆时长,账号访问过多封禁。     设置账号的登录限制,只有登录才能展现内容 设置账号登录的时长,时间一到则自动退出 3.弹出数字验证码和图片确认验证码     爬虫访问次数过多,前端弹出验证码要求输入 4.对 API 接口的限制     每天的登录账户,请求后端 api 接口时,做调用次数限制。对后台 api 返回信息进行加密处理

通过这4层设置,就可以有效的保护数据的安全了

CentOS6.9升级autoconf版本 Autoconf version 2.64 or higher is required

CentOS6.9安装软件时提示说需要Autoconf 2.64或更高的版本

[root@BobServerStation twemproxy]# autoconf

configure.ac:8: error: Autoconf version 2.64 or higher is required

configure.ac:8: the top level

autom4te: /usr/bin/m4 failed with exit status: 63查询当前版本

[root@BobServerStation twemproxy]# rpm -qf /usr/bin/autoconf

autoconf-2.63-5.1.el6.noarch卸载当前版本

[root@BobServerStation twemproxy]# rpm -e –nodeps autoconf-2.63安装最新版本

[root@BobServerStation twemproxy]# wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz[root@BobServerStation twemproxy]# tar zxvf autoconf-2.68.tar.gz[root@BobServerStation twemproxy]# cd autoconf-2.68[root@BobServerStation twemproxy]# ./configure –prefix=/usr/[root@BobServerStation twemproxy]# make && make install 查看当前版本

[root@BobServerStation autoconf-2.68]# /usr/bin/autoconf -V

autoconf (GNU Autoconf) 2.68

Copyright (C) 2010 Free Software Foundation, Inc.

License GPLv3+/Autoconf: GNU GPL version 3 or later

<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. 至此,autoconf已升级到2.68。

ffmpeg .avi 或 .MKV 转换to .MP3

ffmpeg -i "Sample.avi" -vn -ar 44100 -ac 2 -ab 128k -f mp3 "Sample.mp3"
目录查找批量修改方法:
The following command will find all mkv files that are in the current directory and in all sub-folders and extract the audio to mp3 format.

find . -type f -name "*.mkv" -exec bash -c 'FILE="$1"; ffmpeg -i "${FILE}" -vn -c:a libmp3lame -y "${FILE%.mkv}.mp3";' _ '{}' \;
The filename of the audio file will be the same as the mkv video with the correct extension. The mkv extension will be removed and replaced by the mp3 extension e.g hi.mkv will create a new file named hi.mp3

腾讯开放平台3个问题

1)客户认证审核,提示“您的资料正在审核中。”–没有预估审核时间,第一的腾讯为什么做不好toB,就是这个基因问题。此外账号信息编辑及提交审核点击多次都没有反应,最新Chrome浏览器。

2)问题反馈留了一个打不开的链接。http://bbs.open.qq.com/forum-4203-1.html

3)产品与wifi更新文档更新不及时。

nginx通过自定义header属性来转发不同的服务

读取自定义header

首先,开启underscores_in_headers

解释:HTTP头部是否允许下划线。默认为off,表示HTTP头部的名称中不允许带“_”
语法:underscores_in_headers on | off;
默认:underscores_in_headers off;
配置块:http、server

一、背景

因为需要上线灰度发布,只要nginx接收到头部为:

wx_unionid:123456

就会跳转到另外一个url,比如:

127.0.0.1:8080

通过配置nginx 匹配请求头wx_unionid 来转发到灰度环境。 核心:客户端自定义的http header,在nginx的配置文件里能直接读取到。 条件:header必须用减号“-”分隔单词,nginx里面会转换为对应的下划线“_”连接的小写单词。

二、修改Nginx配置

安装nginx

apt-get install -y nginx

编辑主页

cd /etc/nginx/sites-enabled
vim home.conf

内容如下:

upstream wx {
    server 127.0.0.1:8080;
}

server {  
    listen 8008;
    server_name localhost;

    root html;
    index index.html;

    charset utf-8;
    underscores_in_headers on;
    location / {
        #测试header转发 
        if ($http_wx_unionid = "123456") {
            proxy_pass http://wx;
        }  
    }  
}

参数配置说明

underscores_in_headers on:nginx是支持读取非nginx标准的用户自定义header的,但是需要在http或者server下开启header的下划线支持: 比如我们自定义header为wx_unionid,获取该header时需要这样:$http_wx_unionid(一律采用小写,而且前面多了个http_)

如果需要把自定义header传递到下一个nginx: 1.如果是在nginx中自定义采用proxy_set_header X_CUSTOM_HEADER $http_host; 2.如果是在用户请求时自定义的header,例如curl –head -H “X_CUSTOM_HEADER: foo” http://domain.com/api/test,则需要通过proxy_pass_header X_CUSTOM_HEADER来传递

编辑调整页

vim wx.conf

内容如下:

server {
    listen 8080;
    server_name localhost;

    root /var/www/html;
    index wx.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

增加测试页面

vim /var/www/html/wx.html

内容如下:

<h1>微信小程序测试平台</h1>

三、测试结果

加自定义头部

root@ubuntu:~# curl -v -H 'wx_unionid:123456' 127.0.0.1:8008
* Rebuilt URL to: 127.0.0.1:8008/
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8008 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8008
> User-Agent: curl/7.47.0
> Accept: */*
> wx_unionid:123456
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Mon, 29 Jul 2019 07:49:46 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 37
< Connection: keep-alive
< Last-Modified: Mon, 29 Jul 2019 06:23:49 GMT
< ETag: "5d3e90f5-25"
< Accept-Ranges: bytes
< 
<h1>微信小程序测试平台</h1>
* Connection #0 to host 127.0.0.1 left intact

不加头部

root@ubuntu:~# curl -v 127.0.0.1:8008
* Rebuilt URL to: 127.0.0.1:8008/
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8008 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8008
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Mon, 29 Jul 2019 07:50:13 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 612
< Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
< Connection: keep-alive
< ETag: "5890a6b7-264"
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host 127.0.0.1 left intact

四、匹配多条件

现在又多了一个需求,需要对客户端ip为:192.168.0.45,同时也增加自定义头部wx_unionid:123456,才会转发,否则不做转发。

nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。

我们可以用变量的方式来间接实现。

要实现的语句:

if ($remote_addr ~* "192.168.0.45" && $http_wx_unionid = "123456"){
    proxy_pass http://wx;
}

如果按照这样来配置,就会报nginx: [emerg] invalid condition错误。

如下:

nginx: [emerg] invalid condition "$http_wx_unionid" in /etc/nginx/sites-enabled/home.conf:16
nginx: configuration file /etc/nginx/nginx.conf test failed

可以这么来实现,如下所示:

upstream wx {
    server 127.0.0.1:8080;
}

server {  
    listen 8008;
    server_name localhost;

    root html;
    index index.html;

    charset utf-8;
    underscores_in_headers on;
    location / {
        #测试header转发
        # 标志位
        set $flag 0;
        if ($remote_addr ~* "192.168.0.45"){
             # 末尾追加1,此时$flag=01
             set $flag "${flag}1";
        }
        if ($http_wx_unionid = "123456"){
            # 末尾追加1,此时$flag=011
            set $flag "${flag}1";
        }
        # 当为011时,表示条件都匹配
        if ($flag = "011") {
            proxy_pass http://wx;
        }
    }  
}

重新加载配置

nginx -s reload

再次使用本机测试,增加头部

root@ubuntu:~# curl -v -H 'wx_unionid:123456' 127.0.0.1:8008
* Rebuilt URL to: 127.0.0.1:8008/
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8008 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8008
> User-Agent: curl/7.47.0
> Accept: */*
> wx_unionid:123456
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Mon, 29 Jul 2019 08:01:30 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 612
< Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
< Connection: keep-alive
< ETag: "5890a6b7-264"
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host 127.0.0.1 left intact

登录到192.168.0.45,增加头部测试

root@docker-reg:~# curl -v -H 'wx_unionid:123456' 192.168.0.162:8008
* Rebuilt URL to: 192.168.0.162:8008/
*   Trying 192.168.0.162...
* Connected to 192.168.0.162 (192.168.0.162) port 8008 (#0)
> GET / HTTP/1.1
> Host: 192.168.0.162:8008
> User-Agent: curl/7.47.0
> Accept: */*
> wx_unionid:123456
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Mon, 29 Jul 2019 08:02:01 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 37
< Connection: keep-alive
< Last-Modified: Mon, 29 Jul 2019 06:23:49 GMT
< ETag: "5d3e90f5-25"
< Accept-Ranges: bytes
< 
<h1>微信小程序测试平台</h1>
* Connection #0 to host 192.168.0.162 left intact