Zend Framework 2在Nginx服务器下无法路径重写的解决办法

今天我在我的pcDuino上添加Zend Framework 2应用程序,在Nginx中添加了Server的配置之后打开网站,发现首页没有任何问题,但是其他的Module都无法进入,我想想感觉问题应该出在路径重写的问题上。我想要不我把.htaccess的规则改写成Nginx的rewrite规则吧!然后我打开.htaccess,内容如下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

有种虽不明但觉利的感觉,算了,我放弃我刚刚的想法,怎么办怎么办?算了,我还是去咨询一下把,于是跑到Stackoverflow去问了下这个问题,有个老外回答了下:

You really do not need any rewrite rules to make Nginx and ZF2 to play nice together. Here is a very simple Nginx configuration which I use:

server {
    listen *:80;
    server_name DOMAIN;

    # Character Set
    charset utf-8;

    # Logs
    access_log /vhosts/DOMAIN/logs/access_log main;
    error_log /vhosts/DOMAIN/logs/error_log;

    # Directory Indexes
    index index.php;

    # Document Root
    root /vhosts/DOMAIN/public;

    # Location
    location / {
        try_files $uri $uri/ /index.php;
    }

    # Error Pages
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    # PHP-FPM Support
    location ~ \.php$ {
        fastcgi_pass unix:/usr/local/etc/php-fpm/DOMAIN.sock;
        include fastcgi.conf;
    }

    # Block access to .htaccess
    location ~ \.htaccess {
        deny all;
    }
}

Of course change the paths to your current setup. Since you did not mention what type of PHP installation you are using I can’t help you there because I am currently using PHP-FPM.

Using this very simple setup all my modules are working as expected. For example I could visithttp://example.com/some/url OR http://example.com/index.php/some/url

Nginx also has a simple configuration for ZF http://wiki.nginx.org/Zend_Framework#Time_for_nginx

我试了下,果然成功了!

最重要的是配置Location的:

location / {
    try_files $uri $uri/ /index.php;
}

和阻止.htaccess的:

location ~ \.htaccess {
    deny all;
}

dedecms后台无法登录解决办法

今天开始修改一个基于dedecms的网站,我要登录它的后台管理系统,地址是domain/dede,页面显示正常,用户名和密码输入没有问题,结果显示一片空白,根本无法进入后台,于是我开始查找问题所在。

我先找到到dede下的login.php,经过我各种断点之后,发现是79行的:

$cuserLogin->keepUser();

有问题,$cuserLogin是userLogin类的对象,userLogin类的位置在dedecms的include中的userlogin.class.php,在290行左右有一句:

@session_register($this->keepUserIDTag);

我去掉了代码前面的@,程序的报错终于出来了,我到php的手册里查了下session_register这个方法,里面写着大大的Warning:

Warning

本函数已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除

好了!原来如此!我的php正好是5.4,这可如何是好啊?要不我重写一个session_register方法吧!

function session_register(){
	$args = func_get_args();
	foreach ($args as $key){
		$_SESSION[$key]=$GLOBALS[$key];
	}
}

将这段代码写入userlogin.class.php中,dedecms的后台就成功登录进去了!不知道dedecms官方啥时候修改这个bug啊?

服务器PHP开启magic_quotes_gpc导致提交内容多出反斜杠的解决办法

我们的网站常常会担心被SQL注入攻击,SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。你可以打开php.ini,里面有一个设置:

magic_quotes_gpc = Off

这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ‘ 转为 \’ 等,相当于php中的addslashes()函数的处理。这对防止sql注射有重大作用,所以很多服务器都设置了:

magic_quotes_gpc = On

这又给我们带来一个新的问题,如果我们用户提交的是富文本编辑器的HTML内容,又或者在极端的条件下url中带有序列化的内容(带有双引号)。当我们使用$_GET和$_POST的时候会拿到一串被加上反斜杠的字符串,那么有可能将原始的内容破环之后写入数据库,或者反序列化的工作无法完成。那么我们可以使用stripslashes(string)函数将字符串的反斜杠给去掉:

/**
 * 处理服务器开启magic_quotes_gpc
 * @param string $str
 * @return string
 */
public function dealMagicQuotesGpc($str)
{
    if (ini_get('magic_quotes_gpc')) {
        $str = stripslashes($str);
    }
    return $str;
}

这个方法仅仅是改变一个字符串,还有一个方法是递归处理数组的:

if (ini_get('magic_quotes_gpc')) {
     function stripslashesRecursive(array $array)
     {
          foreach ($array as $k => $v) {
               if (is_string($v)) {
                    $array[$k] = stripslashes($v);
               } else if (is_array($v)) {
                    $array[$k] = stripslashesRecursive($v);
               }
          }
          return $array;
     }

     $_GET = stripslashesRecursive($_GET);
     $_POST = stripslashesRecursive($_POST);
}

上面这段代码可以放在框架的入口程序里,可以递归处理$_GET和$_POST数组的每个元素,不管这数组有多深。

Zend Framework无法开启Apache服务器的mod_rewrite模块的解决办法

        Zend Framework的原理是把所有文件的访问都引向单一入口程序index.php,然后再由Zend_Controller_Router_Route进行路由转发,如果使用使用Apache服务器的.htaccess重写规则就必须打开Apache的服务器的mod_rewrite模块,但是很多的服务器是没有打开这个模块的,比如你买了一个空间,结果空间没有打开这个模块,那你又必须使用,怎么办呢?Zend Framework就不可以使用了吗?有的人说不可以,巧妇难为无米之炊。但是我想想觉得如果这个问题都没有解决Zend Framework怎么能在PHP界立足呢?
        后来我找到了解决的方法。方法其实很简单,就是在访问的时候加上index.php就可以了,例如:正常情况下的URL:http://www.youdomain.com/controller/action。现在我们只需把URL改成:http://www.youdomain.com/index.php/controller/action,并把.htaccess删除掉就可以了。