我正在尝试在我的apache localhost上设置一个RESTful Web服务,作为我的骨干应用程序的后端。我试过了:
设置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/
使用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>
我一直在努力争取多年的工作,所以任何帮助都非常感激。
答案 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默认包含这个,所以如果你认为将它包含在框架中是个好主意请在那里发表评论