Сохранение Backbone.js получает «404 not found» на Slim.php

Я создал модель 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, который «перемещается навсегда»:

URL-адрес запроса: localhost/SAMPLE-CODES/backbone.js-mysql-reading-json/websites Метод запроса: Код состояния POST: 301 Перемещено навсегда

Затем я вижу второй отправленный HTTP-запрос:

URL запроса: localhost/SAMPLE-CODES/backbone.js-mysql-reading-json/websites/ Метод запроса: GET Код состояния: 404 Not Found

Мой вопрос: почему этот запрос не вызывает вызов функции «addWebsite»? Я вижу, что второй http-запрос - это GET, хотя он должен быть POST, но даже тогда для этого есть маршрут...

У меня есть папка /сайты/

Я также установил .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 для

localhost/ОБРАЗЦЫ-КОДЫ/магистраль-mysql-чтение-json/веб-сайты

.

Это получает «301 перемещено навсегда» с заголовком ответа:

localhost/ОБРАЗЦЫ-КОДЫ/магистраль-mysql-чтение-json/веб-сайты/

.

Я предполагаю, что это связано с рекомендованными Slim настройками .htaccess.

Вопрос: нормально ли, что "301 перемещен навсегда", или у меня уже есть проблема?

Затем я вижу 2-й http GET в

localhost/ОБРАЗЦЫ-КОДЫ/магистраль-mysql-чтение-json/веб-сайты/


Обновление:

Я все еще получаю 301 на

localhost/ОБРАЗЦЫ-КОДЫ/магистраль-mysql-чтение-json/веб-сайты

, затем ПОЛУЧИТЬ

localhost/ОБРАЗЦЫ-КОДЫ/магистраль-mysql-чтение-json/веб-сайты/

Этот второй запрос работает в браузере и возвращает

[{"id":"1","title":"титр сайта 1"},{"id":"2","title":"титр сайта 2"}]

Так что это был бы ответ для всех записей, но я хотел сохранить 1 запись. Кажется, что редирект 301 неверен.

У меня такое ощущение, что Slim не нашел подходящего маршрута (Slim_Exception_RequestSlash вызовет ошибку 301< /а>).

Но почему мой скрипт Slim не находит маршрут?

Запрос на

localhost/ОБРАЗЦЫ-КОДЫ/магистраль-mysql-чтение-json/веб-сайты

соответствует:

$app->post('/веб-сайты', function() {


person Timothée HENRY    schedule 04.09.2012    source источник


Ответы (2)


Я также использую SlimPHP и у меня такая же установка, как у вас.

Какой PHP вы используете? Если вы используете версию >= 5.3, то способ определения маршрутов будет неправильным. Для более нового PHP попробуйте следующее:

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

Все остальное в вашей установке выглядит вполне нормально для меня.

person jmk2142    schedule 05.09.2012
comment
Спасибо за совет. У меня есть PHP 5.3.5, и я изменил index.php, как вы предлагаете, но я все равно получаю «404 Not Found». - person Timothée HENRY; 05.09.2012
comment
Я все еще в растерянности. Является ли сообщение «301 перемещено навсегда» нормальным явлением или у меня уже есть проблема? - person Timothée HENRY; 05.09.2012
comment
Странно, что вы получаете 301. В вашей структуре http://localhost/SAMPLE-CODES/backbone.js-mysql-reading-json/websites/ где ваш файл index.php и где ваш файл .htaccess? - person jmk2142; 06.09.2012
comment
И index.php, и .htaccess находятся в c:/xampp/htdocs/SAMPLE-CODES/backbone.js-mysql-reading-json/websites/ - person Timothée HENRY; 06.09.2012
comment
Это может быть проблемой. У меня есть структура http://localhost/application/someFolder, а мои index.php и .htaccess находятся на корневом уровне приложения. То есть http://localhost/application/index.php и http://localhost/application/.htaccess Затем, когда я хочу указать URL-адреса своей модели, я просто делаю urlRoot: 'websites'. Маршрутизация начинается там, где находятся ваш индекс и .htaccess, а затем, как вы определили, будет искать подпапку /websites. Попробуйте это и вернитесь ко мне, если это сработает. Если да, то давайте переведем этот комментарий в формальный ответ. - person jmk2142; 06.09.2012
comment
Интересный. Я поместил index.php и .htaccess в папку приложения, и теперь я получаю 301, затем 200 на запрос GET к localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites/, но не получаю ответа. Если я вызываю localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites/ в браузере, я получаю файл json. - person Timothée HENRY; 06.09.2012
comment
Я не уверен, что определил «маршрутизацию». Все, что у меня есть, это модель с urlRoot: './websites'. - person Timothée HENRY; 06.09.2012
comment
Что ж, я думаю, мы куда-то движемся. Если вы получаете JSON через свой браузер, это означает, что ваш маршрут SLIM хотя бы частично работает. Но вы говорите, что Backbone не получает ответа... Хм. Вы смотрели заголовок своего ответа? Если вы используете Google Chrome, проверьте инспектор сети. У меня такое чувство, что ваш сервер отправляет обратно с заголовком типа text/html. Убедитесь, что ваш JSON отправляется обратно с заголовком ответа content-type application/json для Backbone. Давайте посмотрим, что это делает. - person jmk2142; 06.09.2012
comment
Да, сервер отправляет обратно «Content-Type: text/html». Как перейти на «application/json»? на стороне клиента (backbone.js) или на стороне сервера (index.php и Slim)? - person Timothée HENRY; 06.09.2012
comment
Это серверная функция. В Slim есть множество удобных вспомогательных функций, которые помогут вам обрабатывать входящие запросы и исходящие ответы. $response = $app->response(); $response['Content-Type'] = 'application/json'; Вам также потребуется повторно просмотреть документацию. Я знаю, что их много, но все они действительно полезны. ;-) Держи меня в курсе. - person jmk2142; 06.09.2012
comment
Я добавил $app-›contentType('application/json'); внутри моего index.php и теперь получаю ответ с заголовком Response: Content-Type:application/json. Но все равно получите пустой ответ при запросе от магистрального клиента. Разница, по-видимому, заключается в заголовке http-запроса: магистраль отправляет «Accept: application/json, text/javascript» и получает пустой ответ, а строка URL-адреса браузера отправляет «Accept: text/html, application/xhtml+xml, application/xml». ' и получает ответ. - person Timothée HENRY; 06.09.2012

Проблема решена благодаря OrangeWarp и этому вопросу:

Почему я получаю перенаправление 301 на имя папки через косую черту?

Решение состояло в том, чтобы добавить DirectorySlash Off в .htaccess:

Мой обновленный .htaccess (где приложение вызывает Slim.php):

RewriteEngine On
DirectorySlash Off
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
person Timothée HENRY    schedule 07.09.2012