Backbone.js保存在Slim.php上获得'404 not found'

时间:2012-09-04 11:17:55

标签: .htaccess backbone.js slim

我创建了一个Backbone.js模型,并希望将实例保存到MySql数据库。

var Website = Backbone.Model.extend({
    defaults: {   

                "title":"default title"
            },
    urlRoot : './websites'
});


var website = new Website();
website.save();​

我正在使用Slim.php为我的数据库创建Restful API。这是网站\ index.php的开头:

<?php

require 'Slim/Slim.php';

$app = new Slim();

$app->get('/websites', 'getWebsites');
$app->get('/websites/:id',  'getWebsite');
$app->post('/websites', 'addWebsite');
$app->put('/websites/:id', 'updateWebsite');
$app->delete('/websites/:id',   'deleteWebsite');

$app->run();

我的save()触发了一个“永久移动”的POST:

  

请求   网址:本地主机/采样码/ Backbone.js的MySQL的阅读,JSON /网站   请求方法:POST状态代码:301永久移动

然后我看到发送了第二个http请求:

  

请求   网址:本地主机/采样码/ Backbone.js的MySQL的阅读,JSON /网站/   请求方法:GET状态代码:404 Not Found

我的问题是:为什么此请求不会触发对“addWebsite”函数的调用? 我看到第二个http请求是一个GET,当它应该是一个POST时,但即使这样,也有一个路由......

我有一个文件夹/ sites /

我还根据Slim routing documentation设置了.htaccess和http.conf:

的.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

的http.conf

<VirtualHost *:80>
    <Directory "c:/xampp/htdocs/SAMPLE-CODES/backbone.js-mysql-reading-json/websites/">
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

修改

对model.save()的调用会触发http POST到

  

本地主机/样品-CODES /骨架的MySQL-读JSON /网站

这会得到一个'301 Moved Permanently',响应标题说:

  

本地主机/样品-CODES /骨架的MySQL-读JSON /网站/

我认为这是由于Slim推荐的.htaccess设置。

问题:这可以让'301永久移动',或者我这里有问题吗?

然后我看到第二个http GET

  

本地主机/样品-CODES /骨架的MySQL-读JSON /网站/


更新

我仍然在获得301

  

本地主机/样品-CODES /骨架的MySQL-读JSON /网站

,然后GET到

  

本地主机/样品-CODES /骨架的MySQL-读JSON /网站/

第二个请求适用于浏览器并返回

  

[{“id”:“1”,“title”:“titre site 1”},{“id”:“2”,“title”:“titre site 2”}]

这就是所有记录的响应,但我想保存1条记录。 似乎重定向301是错误的。

我觉得这是因为Slim找不到匹配的路线(Slim_Exception_RequestSlash would trigger a 301)。

但为什么我的Slim脚本找不到路线?

的请求
  

本地主机/样品-CODES /骨架的MySQL-读JSON /网站

匹配:

  

$ app-&gt; post('/ websites',function(){

2 个答案:

答案 0 :(得分:1)

我也使用SlimPHP,并且设置与你的一样。

您使用的是什么PHP?如果您使用的是版本&gt; = 5.3,那么您定义路线的方式将不正确。对于较新的PHP,请尝试以下方法:

$app->get('/websites', function () {
    // your code to execute
});

关于你的设置的其他所有内容对我来说都很正常。

答案 1 :(得分:1)

由于orangewarp和这个问题,问题解决了:

Why do I get a 301 redirect to folder name with slash?

解决方法是在.htaccess中添加DirectorySlash Off

我更新的.htaccess(应用程序调用Slim.php):

RewriteEngine On
DirectorySlash Off
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]