<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Web on WilliamKyle&#39;s Home</title>
		<link>/categories/web/</link>
		<description>Recent content in Web on WilliamKyle&#39;s Home</description>
		<generator>Hugo</generator>
		<language>zh-Hans</language>
		
		
		
		
			<lastBuildDate>Thu, 24 May 2012 01:42:54 +0800</lastBuildDate>
		
			<atom:link href="/categories/web/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>关于Discuz在反向代理后用户IP的获取</title>
				<link>/archives/184/</link>
				<pubDate>Thu, 24 May 2012 01:42:54 +0800</pubDate>
				<guid>/archives/184/</guid>
				<description>&lt;p&gt;原本是Discuz的一个安全处理，这时候却给我带来了点麻烦。&lt;/p&gt;&#xA;&lt;p&gt;CG最近想给实验室弄个BBS，于是默认选了Discuz，主机原来是Windows的，装了Apache + MySQL + PHP，安装Discuz的时候还很正常，装完之后CG说上不去了。我打开页面，反应了半天还是没出来，于是打算在虚拟机里面装一个Ubuntu，然后在Ubuntu下跑Discuz。&lt;/p&gt;&#xA;&lt;p&gt;装虚拟机神马的就不再说了，装完之后，突然想到一个问题，虚拟机的IP不能分到一个公网IP，只能是虚拟网卡的内部IP，这就意味着只有服务器能访问虚拟机。我知道Nginx是有反向代理的，然后上网一搜，发现Apache也可以实现反向代理，Apache还确实很强大啊。于是马上修改httpd.conf&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LoadModule proxy_module modules/mod_proxy.so&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LoadModule proxy_http_module modules/mod_proxy_http.so&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ProxyPreserveHost On&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ProxyPass /bbs/ http://192.168.77.80/bbs/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ProxyPassReverse /bbs/ http://192.168.77.80/bbs/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ProxyPass /bbs http://192.168.77.80/bbs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查语法没错，重启Apache服务打开网址一看，OK。装上一个Discuz测试一下，一切正常。然后看到IP我就纠结了，我在论坛上显示的IP都是192.168.77.1，即服务器的IP，怎么会这样子。这个万一要封IP，岂不是都不能上了。于是开始郁闷了，在服务器上抓一下包，发现服务器的Apache反向代理是会转发连接用户的真实IP的，为什么在Discuz中不显示呢？开始我还以为是Discuz设计的问题，没有怎么仔细去查这个问题。突然，今天同学在实验室上网的时候，显示的登录IP是实验室的IP，我就纳闷了，貌似寝室的IP地址Discuz不认啊。于是搜一下源代码，发现在source/class/discuz/discuz_application.php有如下片段&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_get_client_ip&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;$ip &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $_SERVER[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;REMOTE_ADDR&amp;#39;&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;isset&lt;/span&gt;($_SERVER[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HTTP_CLIENT_IP&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;preg_match&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/^([0-9]{1,3}.){3}[0-9]{1,3}$/&amp;#39;&lt;/span&gt;, $_SERVER[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HTTP_CLIENT_IP&amp;#39;&lt;/span&gt;])) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;$ip &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $_SERVER[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HTTP_CLIENT_IP&amp;#39;&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;} &lt;span style=&#34;color:#66d9ef&#34;&gt;elseif&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;isset&lt;/span&gt;($_SERVER[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HTTP_X_FORWARDED_FOR&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;preg_match_all&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s&amp;#39;&lt;/span&gt;, $_SERVER[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HTTP_X_FORWARDED_FOR&amp;#39;&lt;/span&gt;], $matches)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; ($matches[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; $xip) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;preg_match&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#^(10|172.16|192.168).#&amp;#39;&lt;/span&gt;, $xip)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;$ip &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $xip;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; $ip;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原来是Discuz认为寝室的IP段（10.xxx.xxx.xxx）算是伪造的IP，好吧。把寝室的IP段限制删了，马上就正常了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>博客安装笔记</title>
				<link>/archives/22/</link>
				<pubDate>Tue, 31 Jan 2012 19:31:41 +0800</pubDate>
				<guid>/archives/22/</guid>
				<description>&lt;p&gt;之前博客的安装记录。 &lt;a href=&#34;https://web.archive.org/web/20121105184732/http://www.williamkyle.com.cn/&#34;&gt;https://web.archive.org/web/20121105184732/http://www.williamkyle.com.cn/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;以下是原文：&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;WordPress的安装就不用怎么多说了。下载、解压、移动到你想要的目录，修改owner，建数据库，安装就是的。&lt;/p&gt;&#xA;&lt;p&gt;我主要讲一下插件的问题，我装的是&lt;a href=&#34;http://wordpress.org/extend/plugins/ck-and-syntaxhighlighter/&#34;&gt;&lt;strong&gt;CK and SyntaxHighlighter&lt;/strong&gt;&lt;/a&gt;这个插件，它综合了CKEditor、CKFinder以及SyntaxHighlighter三个软件，能够提供可视化编辑器、文件管理以及语法高亮。这个插件还是很不错的，至少很对我的胃口，然而这几个插件本身有着一些不足之处，所以得对它们进行一些修改。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
