<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Discuz on WilliamKyle&#39;s Home</title>
		<link>/tags/discuz/</link>
		<description>Recent content in Discuz 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="/tags/discuz/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>
	</channel>
</rss>
