26
11

关于计划


这几年来读了不少书,kindle里已经占据三分之一的空间,我读书都比较快,虽然一直觉得自己大部分情况下都能抓住书中的观点,可是时间过去很长之后总会忘记。为了不让自己曾经付出的时间浪费掉,打算从这周起,针对每一本自己读过的图书写一个读书笔记或者读书感想,我尽量做到每周写一篇。这么做基于两个考虑,一方面算是复习自己度过的图书,另一方面也算是一种记录,希望能把知识内化为自己的思想、信念。

今天要做的第一本书是卢梭的《社会契约论》,这本书其实很短,有人说卢梭是自由主义的典范,也有人说他是多数人暴政的祖师,但是无论如何,卢梭和《社会契约论》在人类历史、思想史、特别是政治哲学史上产生了巨大的影响。这本书也对我产生极大的影响,我因之而从近三十年的无数枷锁中逐渐解脱出来,形成自己真正的自由意志。

卢梭的这本书的中心思想是:天赋人权;人是生来自由和平等的,国家是自由协议的产物;一切主权和立法权都属于人民的集合体,政府只是这个集合体事务的执行者,并不拥有主权;一旦政府滥权,人民就有资格推翻它。


第一卷

“人是生而自由的,却又无时不处在枷锁之中。人类向来认为自己是万物的主宰,但事实上,他们比其他任何事物所受的奴役都要多。这种情况是如何发生的呢?我无法解释。我所能解释的是,这种情况是如何被合法化的。”

“生为一个自由国度中的公民和这个政权下的一员,我明白我的声音对公共事务的影响是极其微弱的,但我既然拥有投票权,我就应该承担起这一项微小权力赋予我的责任。我所能感到欣慰的是,每当我对政府进行思索,我总会在其中找到新的理由,使我更加热爱我们的国家。”

“人类无数的社会形态中,最古老而又唯一自然的社会便是家庭,然而在这种关系中,只有在孩子需要父亲养育时,才会依附于父亲,一旦这种需要停止,其中的天然依附关系便结束了。孩子从缘于依附关系而产生的顺从关系中解脱出来,而父亲也从对孩子的养育负担中解脱出来,这时,两者都平等地恢复了独立状态。之后,如果他们还想继续保持原来的关系,这只是出于双方的自愿,就不再是自然的了。这时的家庭就只是靠约定来维持了。”

说明:奴隶社会、君主皇权专制社会、独裁专制社会、极权专制社会和威权专制社会的国家,都不符合社会契约论的最基本要求,这一点卢梭做了概括的分析和论证,我认为没有问题。

“怎样才能找到这样一种形式的联合:它在能够用全体成员所结成的集体力量保护其联合者的人身和财产权利的同时,又可使每个成员在联合过程中不用听从于其他的人,而是仅仅服从于自己的意愿,并且可以像以前一样拥有自己的自由。”

“社会契约在公民之间建立了一种平等,公民受同一条件制约,也享有同样的权利。也就是说,根据社会契约的本质,任何主权的约定,即真正属于公意的每个约定,都平等地约束或关怀着每个公民。”


第二卷

“社会契约给政治体以存在和生命,接下来的问题就是通过立法为政治体带来意志和行为的力量,因为使政治体得以联合和形成的那种原始行为并没有决定政治体该如何保存自己和发展自己。”

“社会契约远没有破坏自然的平等,相反,它把人类天生的身体上的不平等用道德的和法律的平等取而代之;从此,不管人与人之间在体力与智力上是如何不平等,人类通过社会契约和法律权利拥有了完全的平等。”

“立法者在所有方面都是国家中非凡的人。他的非凡不仅表现在他的才华上,还因为他的职位。这种职位既不是行政的也不是主权的,它创建了整个国家的制度,却不在该国家机构中居于任何位置。这是一种超脱于人类权力的独立的高级的职能。因为,治人者不能立法,同样,立法者也不能治人。否则,法律就会被立法者的私人感情所左右,会将不公正地固定下来,立法这项神圣的事业就无法避免地被立法者的个人目的所玷污了。”

“负责起草法律的人并不拥有立法权,而人民自己,就算有这种意愿,也不能放弃自己这种不可转移的权利;因为根据社会契约,只有公意才能约束个人行为,决定个人意志是否是公意,必须要通过全民自由投票表决之后。”

“如果一个国家想拥有坚实的力量,它就必须为自己打下坚固的根基,这样才能够经受得住它必须要经历的种种动荡,并能维护为了自保而做的种种努力。因为所有的民族都有一种离心力,这种离心力使他们之间不断地产生摩擦,并试图牺牲别人的利益来满足自己,就如同笛卡尔所说的旋涡。因此,弱者总是处于被吞没的危险中,除非所有民族都能达到一种平衡状态,使任何地方的人们或多或少地一起承受压力,否则任何民族都不能保全自己。”

“如果要探究全体人员的最大利益之所在——这原本也应是每个法律体系的宗旨,我们会发现它可被归结为两个主要目标:自由和平等。自由,是因为国家的力量是个体依赖的源泉;平等,是因为如果没有平等,自由亦不复存在。”

“道德、习俗,尤其是信仰是最为重要的一种法律,它没被刻在石碑上,也没被刻在铜器上,而是刻在了公民心中。它形成了国家的真正体制,它每天都在积聚力量,当其他法律过时或消亡的时候,它激励或取代它们;它可以使一个民族保持创造精神,使习惯的力量逐渐代替权威的力量。这一种法律并不为我们的政治理论家所熟知,但其他一切法律的成败与否都取决于它。伟大的立法者们都懂得秘密关注它,尽管他们表面上只是在制定具体的规章条文,但他们明白这些个别的章节只是制度穹顶的拱架,而缓慢发展的道德与风尚才是形成制度的不可动摇的基石。”


第三卷

“政府就是为了臣民和主权体相互沟通而建立在两者之间的中介体,负责实施法律、维护政治和社会自由。立法权力属于并只能属于人民,行政权力只在特定行为中实施,这种个别行为已经超出了法律的范畴,因此也不属于制定法律的主权范畴,行政权力不能像立法权和主权体一样属于全体人民。”

“究竟什么是政府呢?政府就是为了臣民和主权体相互沟通而建立在两者之间的中介体,负责实施法律、维护政治和社会自由。统治者是主权体的代理人,他们以主权体的名义行使主权体赋予的权力,主权体可以在任何时候限制、更改或收回这种权力;如果放弃这种权力,就会与社会共同体的本质不相容,就是违背了社会契约的目的。”

民主制:主权体可将政府置于全体人民或绝大多数人民的手中,作为政府官员的公民数量就会比作为普通个人的公民要多。我们把这种政府形式称为民主制。贵族制:主权体将政府交付到少数人手中,使普通公民的数量多于行政官员。君主制或皇室政府制:主权体可以把整个政府都集中于一个人手里,其他官员都从这个当权者手里获得权力。”

“组成政府制度的不是一种契约行为,而是法律行为;行政权力的掌握者不是人民的主人,而是人民的雇员,人民可以在适当的时候随意任命或罢免他们,而这里并不存在一个与他们缔约的问题。在完成国家交给他们的职责时,他们只是在以公民的身份履行责任,并没有任何权利对条件进行讨价还价。”


第四卷

“只要有一些人联合在一起,并认为他们是一个整体,那么他们就有了唯一的意志,这个意志指向他们的共同生存和公共福利。和平、团结、平等与政治阴谋是天敌。正直和纯朴的人难以被欺骗,正因为他们是单纯的。诱惑和花言巧语是骗不了他们的,因为他们不够工于心计,所以不会因诱惑而上当。”

“公共事务的处理方式是观照公众道德和政治体健康与否的一个相当准确的标志。集会中达成协议的步调越是一致,就意味着人们的观点越是统一,公共意志也就越占主导地位;而长久的争论、分歧和吵嚷则意味着个人私利的盛行和国家的衰落。”

本质上只有一种法律是需要全体人民一致同意的,这就是社会契约。既然公民联合在一起是世界上最自愿的行为,每个人都是天生自由的,都天生是自己的主人,任何人不能以任何借口不经某人的同意强制他做任何事情。

“统治者和行政官员的选举是一种相当复杂的行为,可以通过两种方式进行,即投票推选或抽签。这两种方式在不同的共和国中都被使用过。投票自然是现代社会最合理的一种方式。”

“正像公共意志是由法律来申明一样,公众判断是由监察机构来阐明的;公共的意见即舆论是另一种法律形式,监察官就是这种法律的执行者。监察官只是人民舆论的发言人,而绝不是人民舆论的权威,一旦它偏离了这一点,它的决定就失去了效用。”

“人类最初并没有国王,有的只是神祇,没有政府,而只有神权政治。既然现在不存在,也不能再存在一个唯一的民族宗教,所以教义中不包括任何违背公民责任的内容,所有容忍了其他宗教存在的宗教也应该被其他宗教所容忍。”

30
10

读书笔记——关于女孩性教育

0
归档:2021年10月分类:点滴生活

父亲的影响

爸爸要时常告诉女儿她有多么美丽,而且是由内而外的美丽(不是只有外表漂亮,而是从内心到外表都很美丽)。女儿从爸爸那里得到信息,知道应该期待从男人那里得到怎样的待遇。如果爸爸尊重她们,那么她们对男人的要求就自然会高,绝不会接受“渣男”。而如果女儿从小就得不到爸爸的尊重,那长大后,她就比较惨了。

在女儿长大后能否和男人保持良好的关系方面,爸爸的影响巨大。的确,影响女孩子长大后自信心的头号因素就是她与父亲的关系。女孩子需要爸爸喜欢和她待在一起,耐心听她说话,对她和她的妈妈说话温柔、行为尊重。

从避孕到关注情感

针对女孩子的性教育严重不足。问题不在于教错了,而是把教育的重心放错了。学校的性教育都是关于如何预防和应对性危害的,比如,如何避免怀孕,如何避免染上性传染病,等等。那些奇形怪状的卵巢和输卵管的图解,看上去像母牛的犄角,如何使用避孕套的教学也令孩子们咯咯傻笑。这里有什么问题吗?难道没有吗?

这里缺少的是对女孩子情感的关注,最为重要的是,忽略了向孩子们描绘性的美好。近百年来,我们的性教育工作者一直只讲与性有关的事实,对性这一过程中的情感避而不谈,而性教育需要的恰恰是关于情感的教育。有确凿的证据表明,从妈妈、阿姨、老师或其他榜样那里学到“性是浪漫的、融化内心的、强烈的、重要的、美好的人生体验”的女孩子会拥有更美好的性生活。

妈妈、阿姨、老师或其他被孩子视为榜样的成年女性应向女孩子强调以下三点:

1.不要过早与他人发生性行为。

2.严格筛选交往对象,即使你不打算与他发生实质上的性关系。

3.在条件和环境允许的情况下与对方发生性关系,绝不是在酒后或在自己还迟疑不定的情况下。

简而言之,一旦女孩子掌握对自己身体的控制权,情况自然就会变好。这不正是你希望发生在自己女儿身上的事吗?

如何与孩子谈性

如何与孩子谈性?伊丽莎白认为,一切要犹如和风细雨,家长应娓娓道来。在孩子的各个成长阶段,家长以孩子那个年龄能接受的方式,不时向孩子讲解性、繁衍、爱、情感等问题,自然就会对孩子有帮助。最不可取的是那种令我们的父辈和我们这一代人都望而却步的所谓的“长谈”。

性是人生的一部分。当孩子在操场上看到小动物交配、小动物生小宝宝时,当不良少年给我们的孩子看手机或者笔记本电脑上的不雅图片时,我们总是用各种莫名其妙的话语搪塞孩子。是时候与孩子讨论这个话题了,用一种自然的、绵绵细雨般的方式与孩子交流,而不是暴风骤雨似的狂轰滥炸。

你要一点一点地慢慢询问,而不要一次讲太多。你们可以一边看电影或电视,一边讨论其中与性有关的内容,作为讨论对象的内容可以是正面的,也可以是负面的。你们还可以在去某处的车上交谈。当他讲述朋友在生活中的各种遭遇时,你要认真地倾听并询问。你们还可以讨论媒体上的色情图片。你可以问问孩子,当看到广告上那么性感热辣的女郎时,他感觉如何。你也可以推荐他读一些不错的书,或与他一起浏览网页,还可以随时随地将你的个人看法和你读到的一些相关信息用电子邮件发给他。

重要的是,通过这些交流,性成了你和孩子思考与讨论的话题。你让他明白,谈到性,他可以有自己的选择和独立的思考,而不是你在单方面立规矩。你在向他说明:“性是一个敏感、重要的话题,而且它很复杂,但这对谁来说都一样。你可以把握自己,掌控一切,你可以选择自己认为合适的一切行为。”

22
10

[转]开源框架Autofac使用入门

0
归档:2021年10月分类:C#和.NET

一、Autofac是什么

说到Autofac,我们就要首先了解依赖注入(Dependency Injection,简称DI)。DI不是什么技术,而是一种设计模式,是用来降低计算机程序之间的耦合的。在.net平台,有很多依赖注入工具,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,Autofac是一款较为轻量级的、性能优异的、支持xml配置的依赖注入工具。这也是为什么我选择先学习Autofac的原因。

1.1 依赖注入(DI)和控制反转(IOC)

依赖注入(Dependency Injection)DI是一种软件设计模式,用来允许我们开发松耦合代码。DI是一种很好的方式去减少软件模块之间的紧耦合关心。DI帮助更好的去管理软件中的功能更新和复杂度。DI的目的是让代码可维护。依赖注入模式使用构造器对对象初始化并提供需要的依赖给对象,也就意味着允许你从类外部注入一个依赖项。

控制反转(IOC,Inversion Of Contrl)也是一种设计模式,它是对DIP(依赖倒置原则,Dependence Inversion Principle)的一种实现。IOC指的是一种框架或运行时的编程风格,用来控制程序流程。IOC意味着我们可以改变常规的控制方式。它在DIP下得以实现。许多基于.net框架的软件开发都使用IOC。IOC更多的是一个通用术语,不仅仅局限于DI。

1.2 DI和IOC在项目中起到什么作用

假设你的客户端类需要使用一个服务类组件,那么你能做的就是让你的客户知道一类IService接口而不是服务类。这样,你就可以随时改变Service类的实现而不会中断已经部署的代码。

二、Autofac如何使用

首先你必须获取AutoFac,这里你可以通过各种方式加载它,我这里还是通过VS中的NuGet来加载AutoFac,不论是哪种方式,最终的目的就是将 Autofac.dll,Autofac.Configuration.dll 这两个程序集引用到你的项目中。这样在你的项目中,如果想使用AutoFac,只需添加其命名空间引用即可~ 这里我用的是2.6版本的(PS:Autofac.Configuration.dll V4.1 已经没有ConfigurationSettingsReader 用法稍有改变,还没去研究)

2.1 Demo分析

代码Demo,这里在控制台应用程序中使用,首先创建一个类

    /// <summary>
    /// 定义一个Animal接口
    /// </summary>
    public interface IAnimal
    {
        void DogCall();
        void CatCall();
    }

然后,写一个类继承此接口

public class Call: IAnimal
    {
        public void CatCall()
        {
            Console.WriteLine("喵喵喵");
        }

        public void DogCall()
        {
            Console.WriteLine("汪汪汪");
        }
    }

接着,用Autofac

    static void Main(string[] args)
        {
        var builder = new ContainerBuilder();//创建一个IOC容器
        builder.RegisterType<Call>().As<IAnimal>();//通过AS可以让Call类中通过构造函数依赖注入类型相应的接口。
        //Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。
        using (var container = builder.Build())
        {
          //当注册的类型在相应得到的容器中可以Resolve你的Call类中所有实例。
          var call = container.Resolve<IAnimal>();
          call.DogCall();
          call.CatCall();
        }

        Console.ReadLine();

      }

使用Autofac的步骤:第一步,定义一个Container容器。第二步,创建builder,并在builder中注册类型。第三步,实例化容器。第四步,在需要使用接口的地方,通过container来解析得到一个借口的实例。

2.2 更多注册容器的方法

我们想将该类型选择通过文件配置进行读取。Autofac自带了一个Autofac.Configuration.dll 非常方便地对类型进行配置,避免了程序的重新编译。修改App.config:在根节点下加上(PS:configSections在程序配置文件中只能放在最前,不然会报配置文件未能初始化错误)

<configSections>
    <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>
  <!--IOC为控制台项目名称-->
  <autofac defaultAssembly="IOC">
    <components>
      <component type="IOC.Call, IOC" service="IOC.IAnimal" />
    </components>
  </autofac>

然后将RegisterType注册方法替换为通过配置文件的方式注册

builder.RegisterType<Call>().As<IAnimal>();//通过AS可以让Call类中通过构造函数依赖注入类型相应的接口。
            builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

其中还有很多注册的方式:Lambda注册、程序集批量注册、Module注册。

22
10

前两天为了研究隐形数字水印技术,了解了一些OpenCV的用法,涉及到把黑色背景图去掉的方法,别的不多说,直接上代码吧!

import os
import cv2

path = "D:/build/utensilspictureNew" #文件夹目录

# 遍历文件夹及其子文件夹中的文件,并存储在一个列表中
# 输入文件夹路径、空文件列表[]
# 返回 文件列表Filelist,包含文件名(完整路径)
def get_filelist(dir):
    newDir = dir
    if os.path.isfile(dir):
        src  = cv2.imread(newDir,1)
        tmp = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
        _, alpha = cv2.threshold(tmp, 0, 255, cv2.THRESH_BINARY)
        b, g, r = cv2.split(src)
        rgba = [b, g, r, alpha]
        dst = cv2.merge(rgba, 4)
        cv2.imwrite(newDir, dst)
        print('Done');
    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            newDir=os.path.join(dir,s)
            get_filelist(newDir)

get_filelist(path)

代码还包括了如何递归遍历文件夹里的文件夹和文件。

18
10

隐形数字水印技术

0
归档:2021年10月分类:架构之路

这两天需要给项目中的图片加水印,考虑到美观就放弃了显性的水印,而采用隐形的数字水印。利用数字水印的不可见性,在不影响作品的情况下,加入版权信息的数字水印,可抗击拷贝,剪切。

数字水印(DigitalWatermarking)技术是将一些标识信息(即数字水印)直接嵌入数字载体(包括多媒体、文档、软件等)当中,但不影响原载体的使用价值,也不容易被人的知觉系统(如视觉或听觉系统)觉察或注意到,只有通过专用的检测器或阅读器才能提取。数字水印是一个崭新的信息隐藏技术,首次提出这个概念至今也不到20年。

我采用的是github上面的一个开源库blind_watermark (https://github.com/guofei9987/blind_watermark)

这是基于小波变换的数字盲水印,用python来写的,效果还可以,不过通过通信软件截图或者发送之后,就无法获取到数字水印了,这个只能防那些直接拿来使用的盗用者。

另外,如果图片上透明背景的png格式,转换之后会生成黑色底色,这个也很不好,我花了两天时间试图修改源码,还是没有完成。

虽然没有能,但是学会了一些OpenCV的技术。

15
10

用python给图片添加半透明水印

0
归档:2021年10月分类:架构之路

我一直都是用C#来完成水印的生产,最近捣腾python脚本,查了一下,可以很方便地用python给图片添加半透明水印。

# coding:utf-8

from PIL import Image, ImageDraw, ImageFont

def add_text_to_image(image, text):
    font = ImageFont.truetype('C:\Windows\Fonts\STXINGKA.TTF', 36) # 获取字体

    # 添加背景
    new_img = Image.new('RGBA', (image.size[0] * 3, image.size[1] * 3), (0, 0, 0, 0))
    new_img.paste(image, image.size)

    # 添加水印
    font_len = len(text)
    rgba_image = new_img.convert('RGBA')
    text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
    image_draw = ImageDraw.Draw(text_overlay)

    for i in range(0, rgba_image.size[0], font_len*40+100):
        for j in range(0, rgba_image.size[1], 200):
            image_draw.text((i, j), text, font=font, fill=(0, 0, 0, 50))
    text_overlay = text_overlay.rotate(-45)
    image_with_text = Image.alpha_composite(rgba_image, text_overlay)

    # 裁切图片
    image_with_text = image_with_text.crop((image.size[0], image.size[1], image.size[0] * 2, image.size[1] * 2))
    return image_with_text

if __name__ == '__main__':
    img = Image.open("test.jpg")
    im_after = add_text_to_image(img, u'test_output')
    im_after.save(u'test_output.png')
25
9

第六届“南宁市十大杰出中学生“名单”和第六届“南宁市十大杰出中学生“提名奖名单”

七县五城区团委、教育局,各开发区团委(团工委)、教育局,全市各中学团委、学生会:

为了贯彻落实党的十六届三中全会和团十五大精神,全面推进素质教育,及时树立优秀中学生典型,展示新世纪我市中学生的聪明才智和青春风采,在全市中学生中再次掀起学习先进、求实创新、提高素质的新高潮。共青团南宁市委、南宁市教育局、南宁市学生联合会开展了第六届“南宁市十大杰出中学生“、“南宁市百名优秀中学生“评选活动,在各级党政领导和社会各界的重视和支持下,本次评选活动已圆满结束。一大批勤奋学习、品学兼优、积极进取、乐于助人、富有创新精神的优秀中学生脱颖而出,成为南宁市当代中学生中的佼佼者,以自己的行 动展现出了新世纪青少年的青春风采。

为树立典型,表彰先进。经共青团南宁市委、南宁市教育局、南宁市学生联合会的认真审核,决定授予谢芳秋等10名同学第六届“南宁市十大杰出中学生“荣誉称号,授予苏铁晖等10名同学第六届“南宁市十大杰出中学生“提名奖,授予 宁晓等100名同学第六届“南宁市百名优秀中学生“荣誉称号,授予南宁市第二中学等10所学校第六届“南宁市十大杰出中学生“评选活动育英奖。

希望受表彰的中学生珍惜荣誉,不懈努力,锐意进取,再创佳绩。号召全市中学生向受表彰的同学学习,以他们为榜样,努力学习,求实创新,崇尚科学,传播文明,努力成为社会主义现代化事业的合格建设者和接班人。

共青团南宁市委员会 南宁市教育局 南宁市学生联合会

2003年12月30日

附1:第六届“南宁市十大杰出中学生“名单

奉献星:谢芳秋(女) 宾阳县宾阳中学373班

创造星:卓 越 广西大学附属中学初三(1)班

博学星:张 远 南宁市第十四中学初三(13)班

余 悦(女) 南宁市第三中学高三(2)班

学干星:李 行 南宁市第二中学高2001(8)班

韦英华(女) 邕宁县高级中学012班

艺体星:黄国星 南宁市第五中学初02(1)班

李 佳(女) 南宁沛鸿民族中学初01(5)班

技能星: 农莉霞(女) 南宁市第一中等职业学校01旅游(1)班

奋进星: 梁琪森 南宁市育才实验中学高二(1)班

附2:第六届“南宁市十大杰出中学生“提名奖名单

奉献星:李月娟(女) 邕宁县长塘镇第一初级中学011班

创造星:玉丹妮(女) 南宁市第一中学高三(1)班

博学星:赵 莉(女) 武鸣县武鸣高级中学武鸣八班 苏铁晖 南宁市第二中学高三(8)班

学干星:张 弛 南宁市第三中学高三实验(2)班 许 媚(女) 南宁市第二十八中学高三(6)班

艺体星:张 慧(女) 南宁市天桃实验学校中学部初一(10)班 夏 照(女) 南宁市五一中路学校初二(3)班

技能星: 黄 龙 南宁市第二十六中学初三(七)班

奋进星: 颜果中 横县第二高级中学(0111)班

17
8

开发过程中,我们有时候需要获取用户的客户端机器的ip地址,在遥远的拨号上网年代,我们只需要通过很简单的Remote_Addr就能获得客户端的真是ip地址,可是随着代理服务器的普及,客户端的ip地址往往不那么容易拿到。

一、Remote_Addr

这个值表示发出请求的远程主机的IP地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

二、x_forwarded_for

简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP。

设置格式:X-Forwarded-For: 127.0.0.1, 192.168.1.1, 202.19.89.64

这个设置表示请求由127.0.0.1发出,经过三层代理,第一层是192.168.1.1,第二层是202.19.89.64,而本次请求的来源IP 1.1.1.1是第三层代理。

三、X-Real-IP

当有多个代理时候,可以在第一个反向代理上配置“proxy_set_header X-Real-IP $remote_addr” 获取真实客户端IP;

四、案例分析

file

(一)、第一种情况

Nginx Proxy
202.19.89.64 nginx.conf
location /test {
    proxy_pass http://192.168.108.1;
}
192.168.108.1 nginx.conf
location /test {
    proxy_pass http://192.168.108.2;
}
Nginx Proxy就是简单的把请求往后转发。
Nginx Backend
192.168.108.108 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr || $http_x_forwarded_for";
}

Nginx Backend输出客户端IP($remote_addr)和X-Forwarded-For请求头($http_x_forwarded_for),当访问服务时输出结果:192.168.108.108 ||

1.$remote_addr代表客户端IP,当前配置的输出结果为最后一个代理服务器的IP,并不是真实客户端IP;

2.在没有特殊配置情况下,X-Forwarded-For请求头不会自动添加到请求头中,即Nginx Backend的$http_x_forwarded_for输出为空。

(二)、第二种情况

通过添加X-Real-IP和X-Forwarded-For捕获客户端真实IP。

Nginx Proxy
202.19.89.64 nginx.conf
location /test {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.108.1;
}
192.168.108.1 nginx.conf
location /test {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.108.2;
}
Nginx Backend
192.168.108.108 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr ||$http_x_real_ip  ||$http_x_forwarded_for";
}

当访问服务时,输出结果为:192.168.108.108 || 202.19.89.64 || 192.168.108.1, 192.168.108.2

1、在离用户最近的反向代理NginxProxy 1,通过“roxy_set_header X-Real-IP remote_addr把真实客户端IP写入到请求头X-Real-IP,在NginxBackend输出http_x_real_ip获取到了真实客户端IP;而Nginx Backend的remote_addr输出为最后一个反向代理的IP。

2、“proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for”的是把请求头中的X-Forwarded-For与remote_addr用逗号合起来,如果请求头中没有X-Forwarded-For则proxy_add_x_forwarded_for为remote_addr。

3、X-Forwarded-For代表了客户端IP,反向代理如Nginx通过proxy_add_x_forwarded_for添加此项,X-Forwarded-For的格式为 X-Forwarded-For real client ip, proxy ip 1, proxy ip N,每经过一个反向代理就在请求头X-Forwarded-For后追加反向代理IP。

4、到此我们可以使用请求头X-Real-IP和X-Forwarded-For来获取客户端IP及客户端到服务端经过的反向代理IP了。这种方式还是很麻烦,$remote_addr并不是真实客户端IP。

五、总结

X-Forwarded-For一般是每一个非透明代理转发请求时会将上游服务器的IP地址追加到X-Forwarded-For的后面,使用英文逗号分割;

X-Real-IP一般是最后一级代理将上游IP地址添加到该头中;

X-Forwarded-For是多个IP地址,而X-Real-IP是一个。

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。