使用apache和windows为Backbone.js设置RESTful服务

时间:2012-02-23 22:13:21

标签: php apache rest backbone.js slim

我正在尝试在我的apache localhost上设置一个RESTful Web服务,作为我的骨干应用程序的后端。我试过了:

  1. 设置WebDAV,但在日志中收到以下错误消息

    [Thu Feb 23 21:46:17 2012] [错误] [client 127.0.0.1]无法为/ clusters / 19设置新内容。 [403,#0],参考者:http://ideas.localhost/ [Thu Feb 23 21:46:17 2012] [error] [client 127.0.0.1]打开资源时发生错误。 [500,#0],参考者:http://ideas.localhost/

  2. 使用Backbone.emulateHTTP导致405 method not allowed error(我认为由于X-HTTP-Method-Override: PUT标头引起的正常POST请求正常工作

  3. 我在Windows 7上运行Apache 2.2.21和PHP 5.3,下面是我的.htaccess文件。我也在使用SLIM框架来处理URL路由。

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    

    虚拟主机配置

    <VirtualHost *:80>
        DocumentRoot "G:/sites/ideas"
        Dav On // I also had security setting set to Allow all as it's just my localhost
        ServerName ideas.localhost
        ErrorLog "logs/ideas.localhost-error.log"
        CustomLog "logs/ideas.localhost-access.log" combined
        SetEnv APPLICATION_ENV development
    </VirtualHost>
    

    我一直在努力争取多年的工作,所以任何帮助都非常感激。

1 个答案:

答案 0 :(得分:4)

不敢相信我在打开奖金后不到一个小时就解决了这个问题,但是嘿嘿。

问题是Slim没有内置的功能来处理骨干使用的X-HTTP-Method-Override标头,并且错误消息不是很具描述性。在request.php的底部添加以下内容并在Backbone中使用emulateHTTP模式修复它

protected function checkForHttpMethodOverride() {
    if ( isset($this->post[self::METHOD_OVERRIDE]) ) {
        $this->method = $this->post[self::METHOD_OVERRIDE];
        unset($this->post[self::METHOD_OVERRIDE]);
        if ( $this->isPut() ) {
            $this->put = $this->post;
        }
    } else if(isset($this->headers['x-method-override'] )) {
        $this->method = $this->headers['x-method-override'];
        if ( $this->isPut() ) {
            $this->put = $this->post;
        }
    }
}

PS - 我为SLIM创建了一个pull request默认包含这个,所以如果你认为将它包含在框架中是个好主意请在那里发表评论