PHP 和 IPF 配置的问题
一、PHP 的 CURLOPT_FOLLOWLOCATION 问题
首先,在 PHP 5.2 及以上版本中,如果启用了 safe_mode
或设置了 open_basedir
,会导致 CURLOPT_FOLLOWLOCATION
失败,进而使 curl_setopt
和 curl_setopt_array
失败。官方对此有如下声明:
Starting in PHP 5.2.0, CURLOPT_FOLLOWLOCATION can't be set via
curl_setopt_array() (or curl_setopt()) when either safe_mode is
enabled or open_basedir is set. In these cases, the order of CURLOPT_*
settings in the array can be important.
1.CURLOPT_FOLLOWLOCATION Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated
when in safe_mode or an open_basedir is set
2.curl_setopt_array()
如果 curl_setopt_array
中包含 CURLOPT_FOLLOWLOCATION
键值,会导致所有的 options
设置失败,这可能会让你觉得 curl_setopt_array
函数本身有问题,但实际上这个函数本身没有问题。
我曾尝试这样一种方法:在 php.ini
中设置 open_basedir
或者 safe_mode
,然后在 Apache(或者 Nginx 的 FastCGI)的 <Directory>
、<VirtualHost>
中设置 php_admin_value open_basedir Off
。然而,结果是相应的虚拟主机无法运行 PHP 了,我也不清楚是为什么。
所以,就目前来看,对于需要使用 curl_setopt_array()
的环境,似乎就不能开启 safe_mode
和设置 open_basedir
的值了。
二、IPF 的 IPF.conf 设置问题
第二个问题是关于 ipf
的 IPF.conf
设置。
网上似乎有很多关于 ipf
的文档,包括 man ipf
看起来也对 ipf
的设置讲解得很详细,但实际上有一些非常细节的内容让人很纠结。可能是我一开始在概念理解上就存在问题,现在我来总结一下。先看看我之前一直在使用的一个 ipf.conf
规则:
pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 22 keep state
pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 80 keep state
pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 443 keep state
pass out all keep state
之前我一直有个疑问,在每条规则后面添加 keep state
就解决了问题。我一开始总是在想,既然已经设置了 pass out all
,为什么还要在 in
的部分特别声明 keep state
呢?现在我终于明白其中的原因了。