我创建了一个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(){
答案 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]