5

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

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

    [2012 年 2 月 23 日星期四 21:46:17] [错误] [客户端 127.0.0.1] 无法为 /clusters/19 放置新内容。[403, #0], referer: 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 请求工作正常

我在 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>

多年来,我一直在努力寻找可以工作的东西,因此非常感谢任何帮助。

4

1 回答 1

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 创建了一个拉取请求以默认包含它,所以如果你认为将它包含在框架中是个好主意,请在此处留下评论

于 2012-02-26T21:20:09.790 回答